【发布时间】:2014-12-17 13:41:35
【问题描述】:
我是一名 PHP 程序员,申请了一份 ASP.NET 工作。他们给了我一个任务,让我制作一个(我选择的)实现多层架构的应用程序。
我有很多难题。据我了解,多层是一个没有通用形式的概念,每个人都应该决定什么是最适合他们的。但是,他们建议我表示层不应该对数据访问层有任何引用,这是有道理的。但是……
我用Add new project(有控制器和视图)创建了一个新项目,它是一个表示层。现在,在表示层中,还有一个class library,它使用Ninject 为整个应用程序注入依赖项,称为NinjectIoC。 NinjectIoC 必须具有对表示层项目的引用,以便将依赖项作为参数直接注入控制器中。它还必须具有对所有其他层(DataAcessLayer、BusinessLayer 等)的引用,以便将它们绑定到它们的依赖项。
主要问题是表示层项目还必须具有对 NinjectIoC 的引用才能在 Global.asax 中创建 StandardKernel,这会创建循环依赖,并且是不允许的。
唯一的解决方案是添加对所有层(包括 DataAccessLayer)的表示层项目的引用,据我所知,这是一件坏事。但是,这是绑定所有层的所有接口并在 Global.asax 中执行的唯一方法。
我想错了吗?
编辑:
NinjectIoC 安装了 Ninject 并引用了所有层,以便在应用程序中绑定它们。它必须有对 UI 的引用才能在 Global.asax 中调用
UI 必须具有对 NinjectIoC 的引用,以便它可以在 Global.asax 中调用它以进行控制器绑定。
我尝试创建一个引用 NinjectIoC 的中间类库。该库在 UI 中被引用。问题在于,这也会创建循环依赖,因为 NinjectIoC 必须具有 UI 的引用才能绑定控制器。
【问题讨论】:
-
将 IoC 抽象为一个通用库(横向层)。然后,您可以在 UI 中实现 Ninject 来执行查找,但在其他库中它不需要任何其他知识,而不是通用库。
-
我想我试过了。我制作了一个仅引用 NinjectIoC 和 NinjectIoC 引用 UI 的“内核”类库。问题是 UI 必须具有对 UI 的引用才能在 Global.asax 中使用它。这也是一个循环依赖。
-
看看ProDinner。这是一个将多层与 MVC 结合使用的示例(并将 IoC 容器分解为 ProDinner.Infra 库)。
标签: asp.net-mvc-4 architecture inversion-of-control multi-tier