我在哪里将AutoFac放在多个项目解决方案中

时间:2014-02-18 23:57:42

标签: asp.net-mvc dependency-injection inversion-of-control autofac

我目前正在一个多项目.net解决方案中实现AutoFac,该解决方案包含多个应用层,UI上的MVC,业务逻辑的中间层以及与我的数据库通信的后端存储库层。

我将使用AutoFac作为依赖项并解决层之间的依赖关系。我有一个关于它的架构的问题。

我原本计划在UI层(MVC Web应用程序)中设置AutoFac模块,但这会导致Web应用程序添加对我解决方案中所有项目的引用,我并不热衷于此,因为我认为UI层应该不知道存储库项目。

如果我将AutoFac设置分配给中间项目并且包含对所有项目的引用,那将抽象出逻辑。但是我在这里遇到的问题是我无法启动初始启动,甚至我在哪里可以放置xml配置。

这里的其他人有什么看法,哪里是我的AutoFac设置的最佳位置?

1 个答案:

答案 0 :(得分:1)

在我看来,在你的UI层上引用项目是没有问题的,因为你必须在容器上注册所有类型。这里的问题是每层的依赖性,我的意思是层之间的耦合类型。由于您正在处理图层之间的抽象,因此无需参考。

我们有一个项目有3个项目需要使用一切(Asp.Net MVC,一些Windows服务和一个WPF项目),我保持我的Container初始化(我使用MS Unity)在另一个类库和参考那里的一切,因为我们需要所有类型来做每个依赖的注册。我在项目中引用了这个项目(Asp.Net Mvc,Windows Services,WPF)并调用它应该在哪里(application_start事件在Global.asax for Web,OnStart事件在Windows服务上,{{ WPF中的1}}文件。

在评论中回答你的问题..你在另一个类库中保留了一些东西(我们称之为program)并且你将在你将要使用的项目上引用这个项目(启动器)(asp .net mvc,console app,winforms,wpf,windows services,wcf等...)。您无需在Starter中引用UI项目。

调用不可访问的方法来初始化所有内容(容器,sessionFactory,如果你正在使用NHibernate),并确保你正在我之前所说的每个类型的项目的正确位置(在Global中Project.Starter事件)。用于Web的asax,Windows服务上的application_start事件,WPF中的OnStart文件等等。)