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

时间:2014-08-22 07:13:48

标签: structuremap

我使用StructureMap DI模式在ASP.NET MVC中开发Web应用程序,以从BAL到UI检索数据,并使用分层架构模式从DAL检索数据到BAL。发现我的班级图。

See my class diagram

所以,我厌倦了将StructureMap服务寄存器配置为

    public class Bootstrapper
    {
          public static void Initialize()
          {
              StructureMapConfiguration.AddRegistry(new ServiceRegistry());
          }
          public class ServiceRegistry : Registry
          {
              protected override void configure()
              {
                   ForRequestedType<IVehicleService> ().TheDefaultIsConcreteType<VehicleService>();
               }
          }
    }

但是,配置未正确应用,发生错误并说“在接口类中找不到某些方法”。当然,它是正确的。因为在我的BAL类中从DAL继承了一些方法/函数。 所以,请帮我解决这个问题,或者给出任何最佳实践来应用我的项目。

2 个答案:

答案 0 :(得分:4)

我建议您重新考虑课程的组织方式,并尝试应用Dependency Inversion Principle。您构建类的方式,您的UI项目将取决于您的BAL项目,这将取决于您的DAL项目。您希望您与数据库(在DAL中)交谈的具体细节依赖于抽象(在您的BAL中),而不是相反。您可以通过实现Onion Architecture(也就是端口和适配器或六边形体系结构)轻松实现此目的。我有a brief online course covering converting from a traditional N-tier architecture (like yours) to this approach

另外,我认为您打算在类图中使用Repository模式,而不是Respiratory。您也可以看到一种简单的入门方式resolving dependencies using StructureMap in ASP.NET MVC 5

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

答案 1 :(得分:1)

不要覆盖&#34; configure()&#34;方法,但在Registry类的构造函数中进行注册。

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

源代码中有很多例子:

https://github.com/structuremap/structuremap/blob/master/src/StructureMap.Testing/Configuration/DSL/RegistryTester.cs