如何将StructureMap用于实际应用程序

如何将StructureMap用于实际应用程序,structuremap,Structuremap,我已经在ASP.NET MVC中开发了web应用程序,使用StructureMap DI模式将数据从BAL检索到UI,并使用分层架构模式将数据从DAL检索到BAL。下面是我的类图 所以,我厌倦了将StructureMap服务注册为 public class Bootstrapper { public static void Initialize() { StructureMapConfiguration.Add

我已经在ASP.NET MVC中开发了web应用程序,使用StructureMap DI模式将数据从BAL检索到UI,并使用分层架构模式将数据从DAL检索到BAL。下面是我的类图

所以,我厌倦了将StructureMap服务注册为

    public class Bootstrapper
    {
          public static void Initialize()
          {
              StructureMapConfiguration.AddRegistry(new ServiceRegistry());
          }
          public class ServiceRegistry : Registry
          {
              protected override void configure()
              {
                   ForRequestedType<IVehicleService> ().TheDefaultIsConcreteType<VehicleService>();
               }
          }
    }
公共类引导程序
{
公共静态void Initialize()
{
StructureMappConfiguration.AddRegistry(新ServiceRegistry());
}
公共类ServiceRegistry:注册表
{
受保护的覆盖无效配置()
{
ForRequestedType()。默认的ConcreteType();
}
}
}
但是,配置应用不正确,出现错误,并表示“在接口类中找不到某些方法”。当然,这是正确的。因为在我的BAL类中,我从DAL继承了一些方法/函数。 所以,请帮助我解决这个问题,或者提供任何最佳实践来应用我的项目

不要重写“configure()”方法,而是在注册表类的构造函数中进行注册

您可能正在使用StructureMap的早期版本,因为注册语法在较新版本中更为简洁

源代码中有很多很好的例子:

不要重写“configure()”方法,而是在注册表类的构造函数中进行注册

您可能正在使用StructureMap的早期版本,因为注册语法在较新版本中更为简洁

源代码中有很多很好的例子:


我建议您重新考虑课程的组织方式,并尝试应用这些方法。按照您构建类的方式,您的UI项目将取决于您的BAL项目,而BAL项目将取决于您的DAL项目。您希望您如何与数据库(在DAL中)通信的具体细节取决于抽象(在BAL中),而不是相反。您可以通过实现(也称为端口和适配器或六边形体系结构)轻松实现这一点。我有

另外,我认为您打算在类图中使用存储库模式,而不是呼吸模式。你也可以看到一个简单的开始方法


一旦你建立了这个架构,事情就会变得非常简单。如果统一命名接口,则可以使用StructureMap的WithDefaultConventions()方法来消除将每个具体类型注册到其关联接口的需要。例如,您可以定义IVehicleRepository(在您的核心项目中)及其实现工具epository(在您的基础设施项目中,它引用了核心)。此时,在您配置StructureMap的UI项目中,您的控制器只需在其构造函数中请求IVehicleRepository,StructureMap将通过您的VehicleRepository实现来满足此类请求(除非您将其配置为其他方式)。

我建议您重新考虑类的组织方式,然后试着应用这个方法。按照您构建类的方式,您的UI项目将取决于您的BAL项目,而BAL项目将取决于您的DAL项目。您希望您如何与数据库(在DAL中)通信的具体细节取决于抽象(在BAL中),而不是相反。您可以通过实现(也称为端口和适配器或六边形体系结构)轻松实现这一点。我有

另外,我认为您打算在类图中使用存储库模式,而不是呼吸模式。你也可以看到一个简单的开始方法


一旦你建立了这个架构,事情就会变得非常简单。如果统一命名接口,则可以使用StructureMap的WithDefaultConventions()方法来消除将每个具体类型注册到其关联接口的需要。例如,您可以定义IVehicleRepository(在您的核心项目中)及其实现工具epository(在您的基础设施项目中,它引用了核心)。此时,在您配置StructureMap的UI项目中,您的控制器只需在其构造函数中请求IVehicleRepository,StructureMap将通过您的VehicleRepository实现来满足此类请求(除非您将其配置为其他方式)。

谢谢,这很好。谢谢,朋友,这很好。