Autofac - 在更大的项目中使用(一个全局容器?)

Autofac - use in bigger project (one global container?)

我正在尝试弄清楚如何在比随处可见的简单示例更大的解决方案中使用 Autofac。

我的问题是您如何构建所有内容?我找到的唯一选择是使用一个全局容器:

示例项目布局:

MyProject 解决方案:

假设我正在托管 WCF 服务。

在我的主机 class 中,在主要方法中我正在实例化容器:

   static void Main(string[] args)
    {
        MyProject.Bootsrapper.ServiceProvider.Container container = MyProject.Bootsrapper.ServiceProvider.RegisterAllINeed();

        ...
        TestManager mngr = new TestManager();
        var query = mngr.Test();
        ...
    }

MyProject.Bootsrapper.ServiceProvider.RegisterAllINeed() 是静态 class 中的静态方法,即 returns:

ContainerBuilder builder = new ContainerBuilder();
(...)
builder.build();

和 MyProject.Bootstrapper.ServiceProvider.Container 是一个静态 属性,它包含对我的全局容器的引用。

这意味着我需要有一个引用所有将被注入的项目。所以 MyProject.Bootstrapper.ServiceProvider 会引用 MyProject.DataAccess、MyProject.Business.Managers、MyProject.Business.Engines 等

感觉这是一种不好的做法,还是正确的做法?

附带问题:我知道使用该解决方案我现在应该注册所有程序集以具有 autofac 以注入依赖项?

It means that I need to have a project that has references to EVERYTHING that will be injected.

应用程序的启动项目将始终引用所有其他项目,无论是直接还是间接,因为依赖关系是可传递的。这种在启动路径中连接整个应用程序的概念称为复合根。

This article详细描述了什么是合成根,为什么它可以引用所有其他项目。