Asp.net mvc 4 Asp.Net多层体系结构类库参考

Asp.net mvc 4 Asp.Net多层体系结构类库参考,asp.net-mvc-4,architecture,inversion-of-control,multi-tier,Asp.net Mvc 4,Architecture,Inversion Of Control,Multi Tier,我是一名PHP程序员,申请了ASP.NET工作。他们给了我一个任务,让我制作一个(我自己选择的)实现多层ArhitSecurity的应用程序 我有很多难题。据我所知,多层是一个没有通用形式的概念,每个人都应该决定什么最适合他们。但是,他们建议我,表示层不应该对数据访问层有任何引用,这是有道理的。但是 我用作为表示层的添加新项目(具有控制器和视图)创建了一个新项目。现在,在表示层中还有一个类库,它使用Ninject为整个应用程序注入依赖项,称为ninjectoc。NinjectRoc必须对表示层项

我是一名PHP程序员,申请了ASP.NET工作。他们给了我一个任务,让我制作一个(我自己选择的)实现多层ArhitSecurity的应用程序

我有很多难题。据我所知,多层是一个没有通用形式的概念,每个人都应该决定什么最适合他们。但是,他们建议我,表示层不应该对数据访问层有任何引用,这是有道理的。但是

我用作为表示层的
添加新项目
(具有控制器和视图)创建了一个新项目。现在,在表示层中还有一个
类库
,它使用Ninject为整个应用程序注入依赖项,称为
ninjectoc
。NinjectRoc必须对表示层项目进行引用,以便将依赖项作为参数直接注入控制器中。它还必须引用所有其他层(DataAcessLayer、BusinessLayer等),以便将它们绑定到它们的依赖项

主要问题是,表示层项目还必须有对NinjectRoc的引用,才能在Global.asax中创建StandardKernel,这会创建cirucullar依赖项,这是不允许的

唯一的解决方案是向所有层(包括DataAccessLayer)的表示层项目添加引用,据我所知,这是一件坏事。但是,这是绑定所有层的所有接口并在Global.asax中执行的唯一方法

我想错了吗

编辑:

ninjectoc
安装了Ninject,并引用了所有层,以便在应用程序中绑定它们。它必须有对UI的引用,才能在Global.asax中调用

UI必须有一个对
ninjectionoc
的引用,以便可以在Global.asax中调用它以进行控制器绑定


我试图创建一个引用NinjectRoc的中间类库。该库在UI中被引用。问题是,这也会创建循环依赖关系,因为NinjectionOC必须有UI的引用才能绑定控制器。

多层可以简单地表示有DAL、BL和UI层。“在UI层中不引用DAL”的要求可以简单地表示您的UI层(MVC4应用程序)只能引用BL。这很容易实现,例如:

  • UI项目(MVC4)
  • 实体项目(类库):在此定义使用的实体,并从所有必要的层引用它(这有助于避免循环引用)
  • BL项目(类库):必须引用实体和DAL项目
  • DAL项目(类库):它引用实体项目
这是一个经典的、最简单的、多层次的项目

当然,在最终的编译中,间接依赖项将包括UI项目和3个库,但是您不需要在UI中添加对DAL的引用

另一个不同的问题是使用国际奥委会模式。在这种情况下,为了解决循环引用问题,我建议您为每个层分别定义“接口”项目和“实现”项目。类似于前面的structurem,但有以下更改:

  • 用户界面项目
  • 实体项目
  • BL接口项目
  • 实现BL接口的项目
  • DAL接口项目
  • 实现DAL接口的项目
您需要定义哪个是主项目。通常是UI项目。此项目将具有所有依赖项

在这种情况下,UI项目直接依赖于BL接口项目。BL接口将取决于DAL接口。简而言之,您的UI项目将只与BL接口有直接依赖关系

问题是,当您尝试运行代码时,它需要解决这种依赖关系,即找到接口的实现,并且没有依赖关系。这是应用程序的“compositio root”,您需要在这里注册依赖项。也就是说,这是您需要定义每个接口将使用哪个具体实现的地方。而且,如果此实现依赖于其他接口,则还必须定义它们的实现。根据框架的不同(我不知道是否可以使用NInject),您可以动态地执行此操作,而无需添加对实现项目的引用。但是,即使您必须包含对所有其他实现和接口项目的引用,您也不会有循环依赖关系,并且您的UI也不会依赖于DAL或实现层。您只需要在IoC容器中注册它们,这是一个非常不同的问题。(如果使用构造函数注入,则可以使用此项目结构获得最大可能的解脉冲)

在项目中保留一个或多个单独的实体可以避免循环引用和项目之间的直接依赖关系。例如,如果在DAL项目中定义了实体,并且在UI项目中使用它们,则需要添加对DAL项目的引用。如果实体在单独的项目中声明,则此问题将消失

纯IoC,如“洋葱架构”(Onion Architecture),通过在主项目(UI项目)中定义依赖项的实体和必要接口,然后在其他项目中实现这些依赖项,并动态解决它们,以避免循环引用,远远超出了这一范围。即,所有其他项目直接或间接依赖于UI项目,而不是反过来。在这种情况下,您需要动态地解决依赖关系,以避免循环引用

正如你所看到的,有很多