【问题标题】:ConfigurationModule passed into Module and context - DotNet CoreConfigurationModule 传递到 Module 和 context - DotNet Core
【发布时间】:2017-11-07 09:57:57
【问题描述】:

所以我正在尝试使用 Autofac DI 通过堆栈传递我的配置 json 文件。我的主要功能如下:

static void Main(string[] args)
{
        Console.WriteLine("Starting...");

        // Add the configuration to the ConfigurationBuilder.
        var config = new ConfigurationBuilder();
        config.AddJsonFile("appsettings.json");

        var containerBuilder = new ContainerBuilder();

        // Register the ConfigurationModule with Autofac.
        var configurationModule = new ConfigurationModule(config.Build());

        containerBuilder.RegisterModule(configurationModule);
        // register a specific consumer
        containerBuilder.RegisterType<BusSettings>();
        containerBuilder.RegisterModule<BusModule>();

        Container = containerBuilder.Build();
}

我已经成功注册了这里的模块...接下来我的 BusModule 被加载...

public class BusModule : Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.Register(context =>
            {
                // Load the settings from the the busSettings class, which entail should come from the config file...
                var busSettings = context.Resolve<BusSettings>();

                var busControl = Bus.Factory.CreateUsingRabbitMq(cfg =>
                {
                    cfg.Host(busSettings.HostAddress, h =>
                    {
                        h.Username(busSettings.Username);
                        h.Password(busSettings.Password);
                    });
                });
                busControl.Start();
                return busControl;
            })
            .SingleInstance().AutoActivate().As<IBusControl>().As<IBus>();
    }
}

然后解析了我的 BusSettings 类,但这是我希望使用配置文件设置属性的地方,问题是我不知道如何从那里访问配置文件...

 public class BusSettings
{
    // I want to be able to get the values from here:
    // But how do I access the config file declared in Main()??
    var hostAddress = _config["AppSettings:HostAddress"];

    //connecting to default vhost
    public Uri HostAddress { get; } = new Uri(hostAddress);

    //using default rabbitmq administrative user
    public string Username { get; } = // Get config from file... ;

    //using default rabbitmq administrative user password
    public string Password { get; } = "";

    public string QueueName { get; } = "";

    //using IIS Express Development Certificate that has cn=localhost
    public string SslServerName { get; } = "";
}

有人知道正确的方法吗?

【问题讨论】:

    标签: c# dependency-injection autofac autofac-module autofac-configuration


    【解决方案1】:

    您只需将configBuilder.Build() 注册为IConfiguration Autofac 即可。所以它看起来像下面这样:

    class Program
    {
        static void Main(string[] args)
        {
            var configBuilder = new ConfigurationBuilder();
            configBuilder
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json");
    
            var config = configBuilder.Build();
    
            var containerBuilder = new ContainerBuilder();
            containerBuilder.Register(context => config).As<IConfiguration>();
            containerBuilder.RegisterType<BusSettings>();
            var container = containerBuilder.Build();
    
            var busSettings = container.Resolve<BusSettings>();
    
            Console.WriteLine(busSettings.HostAddress.ToString());
            Console.Read();
        }
    }
    

    使用 BusSettings 类实现如下:

    public class BusSettings 
    {
        private readonly IConfiguration _configuration;
    
        public BusSettings(IConfiguration configuration)
        {
            _configuration = configuration;
        }
    
        public Uri HostAddress => new Uri(_configuration["AppSettings:HostAddress"]);
    }
    

    【讨论】:

    • 是的,这是正确的解决方案,我最终使用了内置的 IServiceCollection 对象并调用 services.Configure(configuration.GetSection("Configuration"));然后是 services.AddSingleton(configuration);但是这种方法更清洁。我确实觉得 RegisterModule(ConfigurationModule) 几乎什么都不做很奇怪!
    • 终于有点意思了!这是关键:containerBuilder.Register(context =&gt; config).As&lt;IConfiguration&gt;();。我一直在努力遵循官方文档(和其他 SO 帖子/博客)都说要使用 RegisterModule() 但它不起作用。我认为使用 RegisterModule(new ConfigurationModule(config.Build())) 专门用于 Autofac 配置,NOT 应用程序配置已经放弃了。因此,它不会让您访问底层的IConfiguration 对象。文档很糟糕,不要以任何方式说明这一点。
    猜你喜欢
    • 1970-01-01
    • 2021-08-29
    • 2022-01-03
    • 2018-12-19
    • 2021-04-09
    • 2018-03-15
    • 2020-09-22
    • 2020-10-01
    • 1970-01-01
    相关资源
    最近更新 更多