11

假设我有以下 4 个 .net 程序集:

  1. Winform 用户界面
  2. 商业逻辑
  3. SQL Server 数据访问(实现 IRepository)
  4. 通用接口(IRepository 等的定义)

我的业务逻辑 (2) 通过使用构造函数依赖注入的 IRepository(在 4 中定义)调用数据访问层 (3)。但是,当我创建一个业务对象时,我需要传入一个实际的存储库。为此,我的业务逻辑层中有一个单例类返回当前正在使用的实现 IRepository 的具体对象。我得出的结论是,这是一件坏事,因为我的业务逻辑层现在必须引用 3 和 4。

我想我需要一个 IoC 容器,但问题是我在哪里创建/放置它,因为我似乎在哪里创建它(1 - UI)?还需要持有对 3(SQL Server 数据访问)的引用。我不只是在解决问题,而不是实现实际的脱钩吗?

我是否在 UI 中创建 IoC 容器。或者通过另一个新程序集公开它。

(我正在使用 C#、.net 3.5 和 AutoFac)

谢谢。

4

5 回答 5

13

IoC 容器一般应在宿主项目(应用程序入口点)中创建。对于作为 exe 项目的 Windows.Forms 应用程序。

通常在简单的解决方案中(10 个项目以下),只有一个宿主项目应该有对 IoC 库的引用。

PS:使用 Autofac IoC 构建 .NET 应用程序

于 2009-02-11T19:54:33.563 回答
2

注册组件时有几种可能性:

  1. 注册码:

    • 直接
      问题:你必须引用一切(你在这里)
    • 间接
      问题:找出必须注册的内容
      解决方案:
      1. 使用属性
      2. 使用标记接口作为 IService
      3. 使用约定(参见 StructureMap)
  2. 使用配置文件注册:

    • 让容器做一切
    • 自己阅读文件
于 2009-02-11T14:44:22.280 回答
1

顶级是一种方法(UI,正如 Rinat 所说)。

现在至于引用,最简单的方法就是检查当前文件夹中的所有程序集并使用一些约定来获取服务。属性可以正常工作,将注册器类放入每个程序集中都可以正常工作,无论适合您。提取所有内容的代码可能应该在单独的程序集中,除非您的 IoC 框架已经这样做了。

于 2009-02-11T20:25:16.373 回答
0

模块区别和模块定义的“范围”主要存在于编译时。在运行时,一切都是一团糟;)大多数 IOC 容器都在使用它,它们并不真正关心它们的位置。Web 应用程序的 IoC 容器通常会在最外层创建(非常接近 Web 容器本身)。

于 2009-02-11T14:29:37.137 回答
0

确实可以在任何地方创建它,但我会引入一个额外的层,我们称之为 3.5。

您当前的 3 将是您的 IoC 用于数据访问的位置 - 这将成为您实际 DAL 的包装器。根据您的配置,3 将创建一个模拟存储库或一个具体存储库。

所以 2 仍然引用 3,但它只是通过 IoC 框架配置的实际 DAL 的接口。

或者,您可以推出自己的“el-cheapo” IoC - 将 Big Ugly Singleton 更改为静态网关 -在 Singleton 后面抽象 IoC 容器 - 做错了吗?

于 2009-02-11T14:43:13.313 回答