Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc DAL->;BLL<;-图形用户界面&x2B;合成根。如何设置DI绑定?_Asp.net Mvc_Dependency Injection_Inversion Of Control - Fatal编程技术网

Asp.net mvc DAL->;BLL<;-图形用户界面&x2B;合成根。如何设置DI绑定?

Asp.net mvc DAL->;BLL<;-图形用户界面&x2B;合成根。如何设置DI绑定?,asp.net-mvc,dependency-injection,inversion-of-control,Asp.net Mvc,Dependency Injection,Inversion Of Control,我制作了一个三层应用程序,引用如下所述: DAL与存储库->BLL与服务和IRepository只需使用选项1即可 仅仅因为你引用了组件并不意味着你破坏了SoC Web项目仍然对底层实现一无所知,只知道接口 Web项目是以下各层的“聚合器”,因此有必要了解这些层,以便对其进行配置。将ASP.NET MVC应用程序分为两部分: 其中一部分是原始的ASP.NET MVC应用程序,但没有任何逻辑。只需将合成根目录和视图(.aspx等)保留在此项目中即可。因为这是组合根,所以可以引用所有其他项目。然而

我制作了一个三层应用程序,引用如下所述:

DAL与存储库->BLL与服务和IRepository只需使用选项1即可

仅仅因为你引用了组件并不意味着你破坏了SoC

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


Web项目是以下各层的“聚合器”,因此有必要了解这些层,以便对其进行配置。

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

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

  • ASP.NETMVC应用程序
  • 应用模型
  • BLL
  • 达尔

马克·希曼的回答让我想到了这个变体:

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

DAL with Repositories->BLL with services和IRepository我大致按照Mark Seemans的回答将MVC项目一分为二

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

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

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

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

目录结构如下所示

最终得到的依赖关系图如下所示


最近,我也在关注同样的事情,并对MEF(托管可扩展性框架)有所了解。在MEF和reflection的帮助下,您可以从组合根目录中删除DAL/工作单元引用,并且您不需要像上面讨论的那样拥有2个mvc项目。

如果团队的所有成员都确切地知道他们在做什么,那么这就行得通了。如果是这样,设计知识和规程可能足以维持松耦合。但是,如果团队看起来像这样,他们也可以构建一个“松散耦合的单片”应用程序;)引入分层的主要原因是为了防止我们无意中引入紧密耦合,这是非常容易做到的。使用选项1并不能解决这个问题。谢谢,我尝试过这样做,但没有找到一种简单的方法将控制器移动到另一个项目。我在另一个答案中描述了一个稍微不同的结构。控制器只是一个实现IController(或从控制器派生)的类。您可以通过引用适当的ASP.NET MVC程序集在任何项目中定义控制器。我尝试了中描述的分层,效果很好。我仍然不确定是否接受我自己的答案,而不是作者的答案。这是你的问题,所以你知道什么最适合你。在这里,接受你自己的答案是完全可以的。@MarkSeemann我也无法实现让这个根本概念发挥作用。更好的指导(循序渐进)是绝对必要的,它将帮助我们所有人成功地实施正确的DI/IoC战略。我有你的书,读了几遍,作为参考。但是仍然无法使用ninject和mvc3实现根目录。您能否提供一些创建根目录项目的步骤,以及具体移动到哪里,在哪里进行了哪些引用?我创建了一个新的库项目,并添加了对DAL、BLL和所选di框架的引用。我使用Ninject,它与NuGet一起安装。这将在Global.asax.cs中创建一些代码和关于配置绑定的todo注释。但是,此处未引用DAL。相反,我在复合根中调用一个方法,传递内核,并在那里设置绑定。其他一切照常进行。(在BLL和DAL中都没有引用Ninject,使用的是普通构造函数注入。)您在MVC项目中引用的是Ninject,而不是库项目?这一部分很模糊。是的,ninject在库项目中被引用。因此,我使用NuGet在mvc项目中添加ninject,然后从库项目中添加对ninject dll的引用。(如果几个项目使用同一个包,还有其他建议吗?)这看起来是一个不错的计划,但最终MVC应用程序仍然依赖于数据访问层。真遗憾,没有更好的办法了。上面Mark的回答绕开了这一点,但是还有其他问题,比如工具,即使这样,视图仍然在合成根目录中。我很惊讶MVC体系结构不能处理这个问题,因为它是相当新的,并且是为IOC友好而设计的。谢谢Cedd。我想添加的一点是,每个项目的packages.config应该重命名为packages.Reporting.mvcapapplication.config和packages.Reporting.MvcUI.config,这样就不会有冲突,两个项目都可以正常工作。
DAL with Repositories -> BLL with services and IRepository <- Asp.net mvc-app
^------------------------^--------- Composition Root <-------´