繁体   English   中英

如何正确地将结构图依赖关系解析器与ASP.NET MVC Web项目分离?

[英]How to properly decouple Structure Map dependency resolver from ASP.NET MVC web project?

在使用ASP.NET MVC开发Web项目时,我遇到了一个耦合问题。 当我构建自定义控制器工厂(如果使用MVC 3,则为依赖关系解析程序)时,我需要该工厂知道从何处获取依赖关系的方式。 这是我的代码:

//from Global.asax.cs

DependencyResolver.SetResolver(new StructureMapControllerFactory());
class StructureMapControllerFactory: IDependencyResolver {
    Container repositories;

    public StructureMapControllerFactory()
    {
        repositories = new RepositoriesContainer();
    }
    //... rest of the implementation
}
class RepositoriesContainer: Container
{
   public RepositoriesContainer()
   {
      For<IAccountRepository>().Use<SqlAccountRepository>();
      //...
   }
}

StructureMapControllerFactory类负责将依赖项注入到控制器中。 正如我所说,它需要知道在哪里可以找到这些依赖关系(我的意思是具体的类,例如服务和存储库实现)。

我有一个单独的类库MySite.Data ,其中包含所有实现细节。 合同(如IAccountRepository )位于库MySite.Contracts 现在,如果我直接从MVC项目中引用此MySite.Data库,则我的站点与其数据检索的实现之间将存在依赖关系。 问题是如何删除它? 在这种情况下,最佳做法是什么?

我确信它确实有很多解决方法,只是我还没有找到。

好吧,正如我所见,您无法完全做到这一点。 您的MVC项目确实确实需要了解将要使用的具体类。

无论如何,您都将必须在某个地方提供这些容器注册,并且您将获得对定义该类型的项目/程序集的依赖。 不久,您必须从MVC项目中引用MySite.Data。 像那样:

  • MySite.Data对MVC项目一无所知
  • MVC项目知道具体的存储库类型以提供正确的容器注册。

您可以使用StructureMap Registry对象简化工作,但是还需要在某些地方包含这些Registry 通常,它们在主项目或某些“ StructureMap-adapter”项目中,但无论如何您都需要参考。

我建议你:

  • 如果仅将MVC3用于DI,则使用MVC3并将您的自定义IControllerFactory放到Controllers
  • 使用StructureMap Registry对象可以提供所需的每个IoC注册。
  • 使用StructureMap程序集扫描功能提供组件发现。
  • 使用更常见的东西作为DependencyResolver ,即不是使用StructureMapControllerFactory而是使用带有StructureMap适配器CommonServiceLocator
  • 尝试从主应用程序内部的StructureMap本身进行抽象。

并且,当然,不要害怕在主项目中进行引用-它们与耦合无关。 它不会降低可维护性。 但是,错误的体系结构确实存在,因此请担心,而不是简单的参考。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM