【问题标题】:Autofac, IoC & Separation of LayersAutofac、IoC 和层分离
【发布时间】:2013-11-10 11:55:55
【问题描述】:

在我的 ASP.NET MVC 4 c# 项目中,我有 3 层。数据、业务和网络。我遵循存储库模式和服务。

我使用 Autofac 进行依赖注入。我所做的是在 global.asax 中注册组件。 通过这种方式,我必须引用我实现存储库的数据层。

我认为这违反了规则,因为我的 web 项目有数据层的引用。

我已经阅读了一些关于解决这个问题的文章,并找到了 Autofac 模块。但是,如果不引用数据层,我也找不到实现它的方法。

有没有办法在不引用数据层的情况下注册组件?

谢谢。

【问题讨论】:

  • 数据层实现的接口定义在哪里?
  • 数据层由通用存储库和工作单元类以及从通用存储库派生的存储库类组成。事实上,我有 4 个项目,其中 3 个在问题中提到,第 4 个是我实现实体的域项目(代码优先)。服务位于业务层。
  • 谢谢马克。我读过那篇文章和你的“组合根”文章。我现在对 Autofac 模块的使用感到困惑。如果可以通过添加项目引用在我的表示层(MVC 应用程序 - global.asax)中注册组件,那么我为什么需要使用模块?非常感谢。
  • 为什么需要模块?这是个好问题。我会说你几乎不需要这样的功能。

标签: c# asp.net-mvc dependency-injection ioc-container autofac


【解决方案1】:

在我看来,您所遇到的情况正是您正在寻找的。

您不想要这样的引用结构:LibA => LibB => LibC => ...

最后,您想要的是一个 DLL/项目/组件将所有项目捆绑在一起(称为组合根)并且组件之间没有依赖关系 这样你的领域层就不会依赖其他任何东西。

可以从表示层引用您的数据层(如果那是您的组合根所在的位置)。

如果您希望应用程序的不同部分有不同的组合根,则模块很有用。一个假设的例子是管理区域和客户区域。如果它们的依赖关系足够不同,您可能希望为每个区域使用组合根,尽管它们位于同一个项目中。

【讨论】:

    猜你喜欢
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多