我已按照本answer中的说明制作了一个三层应用程序:
DAL with Repositories -> BLL with services and IRepository <- Asp.net mvc-app
为了让依赖注入运行,我看到了几个选项:
1.从Web应用程序添加对DAL的引用,以便能够在应用程序启动时设置绑定
2.使用具有xml配置的容器
(3.使用反射加载dal-assembly并查找类型)
选项1.很简单,也可以将DAL.dll复制到bin但是我突然重新引入了我努力摆脱的引用。现在可以直接访问存储库。选项2和3似乎不必要地复杂。
没有别的办法吗?
答案 0 :(得分:15)
将ASP.NET MVC应用程序分成两部分:
生成的分层看起来像这样:
答案 1 :(得分:7)
Mark Seemann的回答让我想到了这个变种:
DAL with Repositories -> BLL with services and IRepository <- Asp.net mvc-app
^------------------------^--------- Composition Root <-------´
这是为了说明不是让Web项目引用DAL,而是引用一个引用DAL和BLL的单独的Composition Root项目。 composition-root-project有一个类,有一个定义绑定的方法。它提供了以下额外好处:
我没有看到任何大的缺点。
答案 2 :(得分:3)
选择选项1。
仅仅因为你对程序集的引用并不意味着你打破了SoC。
Web Project仍然对底层实现一无所知,只知道接口。
Web项目是以下层的“聚合器”,因此有必要了解它们以便配置它们。
答案 3 :(得分:1)
我将MVC项目分成两部分,大致如Mark Seemans答案所述。
MVCApplication是一个简单的对象,需要引用所有内容,但除了global.asax(它需要)和web.config(它似乎想要)之外,它没有任何MVC代码。
MvcUI项目仅引用接口并使用依赖注入。
如果将两个项目(.csproj文件)放在同一目录中,那么内容,控制器,模型,脚本和视图文件夹实际上都在同一个位置,因此所有工具都可以工作。
下面解决方案的图片显示了这个想法。
目录结构看起来像这样
最终得到了像这样的依赖关系图
答案 4 :(得分:0)
最近我也在关注同样的事情并想出了MEF(Managed Extensibility Framework)。在MEF和反射的帮助下,您可以从组合根中删除该DAL /工作单元引用,并且您不需要如上所述的2个mvc项目。