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

Gra*_*eit 13 asp.net-mvc dependency-injection inversion-of-control

我与refrences如本描述去一个三层应用程序的答案:

DAL with Repositories -> BLL with services and IRepository <- Asp.net mvc-app
Run Code Online (Sandbox Code Playgroud)

为了让这种依赖注入运行,我看到了几个选项:
1.从web-app添加对DAL的引用,以便能够在应用程序启动时设置绑定.
2.使用具有xml配置的容器
(3.使用反射加载dal-assembly并查找类型)

选项1.很简单,也可以将DAL.dll复制到bin但是我突然重新引入了我努力摆脱的引用.现在可以直接访问存储库.选项2和3似乎不必要地复杂.

没有其他办法吗?

Mar*_*ann 15

将ASP.NET MVC应用程序拆分为两个:

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

生成的分层看起来像这样:

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

  • 这是你的问题,所以你最了解什么对你有用.在SO上,完全可以接受你自己的答案作为*答案. (3认同)

Gra*_*eit 7

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

DAL with Repositories -> BLL with services and IRepository <- Asp.net mvc-app
^------------------------^--------- Composition Root <-------´
Run Code Online (Sandbox Code Playgroud)

这是为了说明不是让Web项目引用DAL,而是引用一个引用DAL和BLL的单独的Composition Root项目.composition-root-project有一个类,有一个定义绑定的方法.它提供了以下额外好处:

  • 只有三层.四层将是团队中的一个艰难的卖点.
  • 确保松散的联轴器.无法从视图代码访问DAL.
  • 更好的工具支持.控制器保留在标准位置,因此可以在上下文菜单中访问"添加控制器",并在控制器代码中突出显示缺少的视图.此外,无需配置或编写自定义控制器工厂.

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