[英]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。 像那样:
您可以使用StructureMap Registry
对象简化工作,但是还需要在某些地方包含这些Registry
。 通常,它们在主项目或某些“ StructureMap-adapter”项目中,但无论如何您都需要参考。
我建议你:
IControllerFactory
放到Controllers
。 Registry
对象可以提供所需的每个IoC注册。 DependencyResolver
,即不是使用StructureMapControllerFactory
而是使用带有StructureMap适配器的CommonServiceLocator 。 并且,当然,不要害怕在主项目中进行引用-它们与耦合无关。 它不会降低可维护性。 但是,错误的体系结构确实存在,因此请担心,而不是简单的参考。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.