【问题标题】:How to use Autofac in a 3 layered web application (ASP.NET MVC)?如何在 3 层 Web 应用程序(ASP.NET MVC)中使用 Autofac?
【发布时间】:2008-11-27 15:38:19
【问题描述】:

我可以找到的示例使用两层架构,其中控制器直接使用数据访问层中的存储库类。请参阅herehere

如果您有使用这些组件的服务或业务逻辑层,您会在哪里从数据访问层注册组件?理想情况下,不应从用户界面层引用数据访问层,对吗?所以 Application_Start 不是合适的地方。

有什么更好的方法?

谢谢!

【问题讨论】:

  • 抱歉,我无法回答您的问题,但您提供的指向此 MVC Commerce 应用程序的链接非常有用且富有洞察力,非常感谢。 :)

标签: asp.net-mvc dependency-injection autofac


【解决方案1】:

必须知道您要使用哪些实现。通常有 3 种方法可以实现这一点:

  1. Autofac 使用的编译时
  2. 在运行时来自 Castle Windsor 可以执行的预定义配置文件
  3. 在运行时使用动态配置

使用 Autofac,您有几个选择

  1. 在 Application_Start 中将所有内容连接在一起
  2. 将责任交给实现factory pattern 并注册所需组件的另一个组件。

对于#2,我将实现 IContainer 接口之类的东西,以便您的 IoC 框架与您的系统松散耦合。然后让您的数据访问实现使用该接口注册所需的组件。

【讨论】:

  • 好的,那么在第一种情况下(Application_Start 中的所有内容),Web 应用程序现在必须直接引用数据访问层组件是否存在问题?
  • 如果让您的 Application_Start 了解您的数据访问层是一个问题,您总是可以将您的 IoC 实现抽象到接口后面并将其移动到其他地方。然后,您的 Web 应用程序可以忽略要注册的 DAL 的决定。
  • 除非您的 DAL 位于 Web 服务后面,否则您的 Web 应用程序将需要通过 bin 目录或 GAC 访问您的 DAL 程序集,不是吗?
  • 您至少可以将每一层的需求“隐藏”到 Autofac 模块中。然后给定层的模块将“知道”它需要的类型,但主应用程序(Application_Start)只需要知道要加载哪些模块。
猜你喜欢
  • 1970-01-01
  • 2018-12-25
  • 2023-03-27
  • 1970-01-01
  • 2010-11-14
  • 2011-08-30
  • 2015-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多