2

我正在使用 Unity IoC 框架,并Bootstrapper.cs在我的主机 MVC 层中有一个类来注册所有组件。然而,在我的架构中,我在 MVC 层下方有一个“服务”层,它也使用 DI,并且注入了存储库接口(MVC 层中不使用存储库接口 - 它具有注入其控制器的服务层接口) .

所以我的问题如下:我是否仍然可以在整个应用程序的 MVC/UI 层中将存储库接口注册到它的具体类型,或者我是否添加另一个对 Unity 的引用并Bootstrapper.cs在我的“服务”层中创建另一个类来定义接口该特定层使用的类型?

即使答案是我可以在 UI 层注册接口,我仍然想知道常见的做法。我喜欢在 MVC/UI 层中注册该类型的事情是我必须添加对 Repository 层的引用才能进行注册,即使知道它没有在该层中使用。它用于服务层。

谢谢!

4

4 回答 4

6

每个应用程序都应该有自己的Composition Root,即您配置应用程序的地方(有关详细信息,请参阅此答案)。

这取决于上下文,但一般来说,如果您在层之间拆分容器配置,您将决定层的配置过于靠近层,您可能会失去总体视图。

例如,在您的一个业务逻辑层中,您正在注册一项服务:

container.RegisterType<ISercice1, MyImplementation1>(new PerThreadLifetime())

但是当在 Web 应用程序中使用该层时,您可以决定 PerSession 或 PerRequest 的生命周期会更好。这个决定应该只在一个地方而不是通过层传播。

于 2013-01-25T07:46:14.907 回答
3

我把你的问题转过来了。

如果您在类库中添加对 Unity 的引用,您将向您正在使用的框架添加依赖项。这与你想要达到的目标完全相反。

您的类应该需要的唯一调整是支持构造函数或使用公共属性 - 在接口上。就是这样!

所以你的应用程序入口点应该做所有的“引导”。请注意,入口点可以是不同的应用程序以及不同的测试项目。他们可以有不同的配置和模拟场景。

如果您的 bootstrap.cs 变大,出于可读性原因,您可以将其拆分为更小的部分。但是我拒绝让班级知道他们正在被引导/moqed/注入的事实以及被什么。

考虑重复使用。您当前的库正在使用 Unity。它们可以在使用 StructureMap 的项目中使用。或者为什么不 Ninject。

于 2013-01-24T22:41:51.427 回答
2

简而言之,是的,可以将配置保持在流程的顶部或本地化到每个模块。但是,必须为过程中的整个对象图解决所有依赖关系。

通过将配置保存在每个模块(程序集)中来本地化配置通常是一个好主意,因为您允许服务层对其自己的配置负责。恕我直言,我对这个问题的回答是一个很好的做法。

于 2013-01-24T22:16:09.507 回答
0

是的,应用程序在入口点应该有一个组合根。但是将类的注册保留在实现它们的层内可能是一个好习惯。然后从组合根的层中提取这些注册,逐层注册实现。这就是为什么:

  1. 层内的注册可以在其他地方重新定义,例如在入口点。大多数 IoC 库的工作方式是稍后完成的注册会抹去之前完成的注册。因此,层内的注册只定义了一个可以轻松覆盖的默认行为。
  2. 您不需要在所有项目\层中引用 IoC 库,即使您在这些层中定义了注册。一组非常简单的包装类将允许您从除入口点之外的任何地方抽象出 IoC 细节。
  3. 当您的应用程序有多个入口点时,可重复使用的注册将极大地帮助防止重复相同的注册。这个复制\粘贴总是不好的。应用程序经常有几个入口点。例如,考虑跨平台应用程序的场景,它的每个目标平台都有一个单独的入口点。或在网站和后台进程中重用的业务逻辑。
  4. 通过可重复使用的注册,您可以构建一个非常有效的测试系统。您将能够从测试中运行整个层,以自动化方式模拟整个层,并且非常有效地执行此操作,从而最大限度地减少编写测试的工作量。

请参阅我的博客文章,通过工作示例更详细地说明这些要点。

于 2014-02-10T16:04:23.580 回答