如何使用配置注册 Autofac 模块

JcM*_*y3r 1 c# dependency-injection autofac .net-core

我有一个控制台应用程序,其中引用了一个类库,该应用程序本身也引用了一个类库(瀑布)。问题是我想IConfiguration通过 Autofac 模块传递它来注册我的,然后让它们在最低的库中访问,我不知道如何实现这一点。(我的设计要点是拥有一个独立的 NuGet 包,可以通过控制台应用程序或网站引用)

重点是我想在我的新网站中注册 main .dll( Notification.Send),而不必担心注册较低的杠杆.dll( Notification.Queue),但仍然可以访问网站appsettings.json。这是我的例子

控制台应用程序

    class Program
    {
        static void Main(string[] args)
        {
            IConfiguration Configuration = new ConfigurationBuilder()
               .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
               .AddEnvironmentVariables()
               .AddCommandLine(args)
               .Build();

            var builder = new ContainerBuilder();
            //How to pass "Configuration" to SendNotificationModule?
            builder.RegisterModule(new SendNotificationModule());
        }
    }
Run Code Online (Sandbox Code Playgroud)

通知.发送(库)

    public class SendNotificationModule : Module
    {
        protected override void Load(ContainerBuilder builder)
        {
            base.Load(builder);

            //How to pass "Configuration" to QueueModule?
            builder.RegisterModule(new QueueModule());
        }
    }
Run Code Online (Sandbox Code Playgroud)

通知.队列(库)

    public class QueueModule : Module
    {
        protected override void Load(ContainerBuilder builder)
        {
            base.Load(builder);

            //Here I want to register a custom interface which I can use to retrieve config from
            //and then use for DI in my Notifications.Queue dll

        }
    }
Run Code Online (Sandbox Code Playgroud)

我对 Autofac 不太熟悉,也许找错了树,但我到处搜索过,但无法弄清楚这一点。

quj*_*jck 5

为什么不通过模块构造函数传递它?

class Program
{
    static void Main(string[] args)
    {
        var configuration = // ..
        builder.RegisterModule(new SendNotificationModule(configuration));
    }
}
Run Code Online (Sandbox Code Playgroud)

通知.发送(库)

public class SendNotificationModule : Module
{
    private readonly IConfiguration configuration;

    public SendNotificationModule(IConfiguration configuration)
    {
        this.configuration = configuration;
    }

    protected override void Load(ContainerBuilder builder)
    {
        base.Load(builder);
        builder.RegisterModule(new QueueModule(configuration));
    }
}
Run Code Online (Sandbox Code Playgroud)

通知.队列(库)

public class QueueModule : Module
{
    private readonly IConfiguration configuration;

    public QueueModule (IConfiguration configuration)
    {
        this.configuration = configuration;
    }

    protected override void Load(ContainerBuilder builder)
    {
        base.Load(builder);

        //Here I want to register a custom interface which I can use to retrieve config from
        //and then use for DI in my Notifications.Queue dll

    }
}
Run Code Online (Sandbox Code Playgroud)