DAL – > BLL < – GUI +组合根。 如何设置DI绑定?

我做了一个三层应用程序,参考这个答案中描述的refrences:

DAL with Repositories -> BLL with services and IRepository <- Asp.net mvc-app 

为了使dependency injection运行,我看到几个选项:
1.从Web应用程序添加对DAL的引用,以便能够在应用程序启动时设置绑定。
2.使用xml-configuration的容器
(3.使用reflection来加载dal-assembly并查找types)

选项1很容易,也使DAL.dll被复制到垃圾箱,但后来我突然重新介绍了我努力摆脱的参考。 现在可以直接访问存储库。 选项2和3似乎不必要的复杂。

有没有别的办法?

将ASP.NET MVC应用程序分成两部分:

  • 一部分是你最初的ASP.NET MVC应用程序,但是没有任何逻辑。 只要在这个项目中保留Composition Root和你的Views(.aspx等)。 由于这是组合根,所以您可以引用所有其他项目。 但是,由于所有的逻辑都被提取出来了,所以现在这是一个谦虚的对象 ,所以在这个层次上所有的引用都是可以的。
  • 将所有的逻辑(控制器等)提取到一个应用程序模型项目中,该项目只是一个引用ASP.NET MVC二进制文件的普通库项目(.dll)。 这个项目需要引用BLL来获取接口,但没关系。 但是,应用程序模型和BLL都有效地屏蔽了DAL。

生成的分层将如下所示:

  • ASP.NET MVC应用程序
  • 应用模型
  • BLL
  • DAL

Mark Seemann的回答给了我这个变种的想法:

 DAL with Repositories -> BLL with services and IRepository <- Asp.net mvc-app ^------------------------^--------- Composition Root <-------´ 

这是为了说明不是让Web项目引用DAL,而是引用一个单独的引用DAL和BLL的组合根项目。 composition-root-project有一个类,其中一个方法定义绑定。 它提供了这些额外的好处:

  • 只有三层。 四层将是一个艰难的销售队伍。
  • 松耦合得到保证。 从视图代码访问DAL是不可能的。
  • 更好的工具支持。 控制器保持在标准位置,因此可以在上下文菜单中访问“添加控制器”,并在控制器代码中高亮显示丢失的视图。 也不需要configuration或写入自定义控制器工厂。

我没有看到任何大的缺点。

只要去select1。

仅仅因为你有一个参考大会并不意味着你打破了SoC。

Web项目仍然不知道底层的实现,只有接口。

Web项目是下面几层的“聚合器”,因此它是有道理的,应该知道它们以configuration它们。

我大致按照Mark Seemans Answer的说法,将MVC项目分成两部分。

MVCApplication是一个不起眼的对象,需要引用所有的东西,但除了global.asax(它需要)和web.config(它似乎需要)之外没有任何MVC代码。

MvcUI项目只引用接口并使用dependency injection。

如果将两个项目(.csproj文件)放在同一个目录中,那么内容,控制器,模型,脚本和视图文件夹实际上都在同一个位置,所以所有的工具都可以工作。

下面的解决scheme的图片显示了这个想法。

MVC组合根解决方案资源管理器

目录结构看起来像这样

MVC组合根目录结构

最后你会得到一个这样的依赖关系图

MVC组合根依赖关系图

最近我也在关注MEF(Managed Extensibility Framework)。 在MEF和reflection的帮助下,你可以从你的合成根目录中删除DAL /工作单元的引用,并且不需要如上所述的2个mvc项目。