1

我有一个具有以下结构的 3 层解决方案:

UI -> BLL <- DAL

UI 是一个 ASP.NET MVC 应用程序。每个控制器的构造函数都需要 BLL 组件。每个 BLL 组件在其构造函数上都需要 DAL 组件。

过去我使用 StructureMap 作为 IoC 容器。在其早期版本中,StructureMap 使用ObjectFactory静态类。因为它是一个静态类,所以我可以在 MVC 上使用 StructureMap 来替换默认值ControllerFactory,然后是另一个进行 BLL 和 DAL 配置的项目。

在较新的 StructureMap 版本中,ObjectFactory 已被标记为过时。我明白现在我必须提供我自己的 Container 实例。

但是,如果没有连接我的项目,我就不会发生这种链条。此外,如果我将 BLL 和 DAL 的配置添加到 MVC 项目,我将不得不在 UI 级别引用我想避免的所有内容。

我认为我必须做的是使用 StructureMap 保留两个不同的项目。

MVC 项目内部的一个,负责创建控制器。但是,我需要找到一种将 BLL 实例委托给第二个容器的方法,该容器可能会保持原样并知道如何创建 BLL 和 DAL(因此可以创建 BLL)。

第二个(创建 BLL 组件)如下所示:

public static class BLLContainer
{
    public static Container BuildServiceContainer()
    {
        return new Container(x =>
        {
            // This uses the Scan method to locate BLL and DAL
            // interfaces and implementations.
            x.AddRegistry(new DALRegistry());
        });
    }
}

我的问题是:

  1. 是否真的可以在 BLL 级别将对象创建从我的 MVC 应用程序委托给 StructureMap 容器,而无需引用其他(不需要的)项目?

  2. 如果我要返回容器的新实例,如上面的代码所示,这意味着我正在为对 Web 服务器的每个请求运行扫描程序(StructureMap 使用 PerRequest 作为默认值)。我怎样才能避免这种情况?除了回到单身人士之外,我不知道如何防止这种情况发生。

4

1 回答 1

3

我从未使用过 StructureMap,所以我的答案与 StructureMap 或如何使用它无关。

当您使用依赖注入时,所有内容都围绕您的组合根。这是组成完整应用程序的地方,所以这个地方也需要你的应用程序的完整知识。

如果您确实不想从 UI 中引用您的 DAL,您可以将您的组合根放在不同的程序集中,并从您的 UI 程序集中引用该程序集。

但是有什么区别呢?通过从 UI 中引用 BL 和 DAL 程序集,IMO,只要您仅从组合根中引用 DAL 中的类而不直接在控制器中使用它们,就不会做错任何事情。除了创造错误地做到这一点的可能性之外,没有其他真正的问题。

关于你的第二个问题。您的应用程序必须有 1 个且只有 1 个 DI 容器。将其拆分到多个容器中会给您带来麻烦。Mark Seeman 已经提到的博客明确指出每个应用程序都需要一个组合根。

一个体面的 DI 容器将为您提供各种选项来控制所创建对象的生命周期,因此只要您为容器提供这样做的机会,就不需要所有单例。

我选择的 DI 容器是Simple Injector您可以在此处开始阅读有关此容器的信息。Simple Injector 也有一个MVC的快速启动包,并且有非常热情的社区,他们总是很乐意帮助你。

于 2015-02-08T22:58:13.650 回答