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

时间:2011-03-11 00:11:33

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

我已按照本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似乎不必要地复杂。

没有别的办法吗?

5 个答案:

答案 0 :(得分:15)

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

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

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

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

答案 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有一个类,有一个定义绑定的方法。它提供了以下额外好处:

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

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

答案 2 :(得分:3)

选择选项1。

仅仅因为你对程序集的引用并不意味着你打破了SoC。

Web Project仍然对底层实现一无所知,只知道接口。

Web项目是以下层的“聚合器”,因此有必要了解它们以便配置它们。

答案 3 :(得分:1)

我将MVC项目分成两部分,大致如Mark Seemans答案所述。

MVCApplication是一个简单的对象,需要引用所有内容,但除了global.asax(它需要)和web.config(它似乎想要)之外,它没有任何MVC代码。

MvcUI项目仅引用接口并使用依赖注入。

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

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

MVC Composition Root Solution Explorer

目录结构看起来像这样

MVC Composition Root Directory Structure

最终得到了像这样的依赖关系图

MVC Composition Root Dependency Graph

答案 4 :(得分:0)

最近我也在关注同样的事情并想出了MEF(Managed Extensibility Framework)。在MEF和反射的帮助下,您可以从组合根中删除该DAL /工作单元引用,并且您不需要如上所述的2个mvc项目。