0

私は、Autofac DIを使用して、コンフィギュレーションjsonファイルをスタックに渡そうとしています。次のように私の主な機能は次のとおりです。私のBusModuleがロードされている隣の私はsucessfully ...ここにモジュールを登録しているConfigurationModuleがモジュールとコンテキストに渡されました - DotNet Core

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(); 
} 

...

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; } = ""; 
} 

誰もがこれを行うための正しい方法を知っていますか?

答えて

0

configBuilder.Build()IConfigurationとして登録するだけでいいですね。このように実装BusSettingsクラスで

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(); 
    } 
} 

:だから、それは次のようになります

public class BusSettings 
{ 
    private readonly IConfiguration _configuration; 

    public BusSettings(IConfiguration configuration) 
    { 
     _configuration = configuration; 
    } 

    public Uri HostAddress => new Uri(_configuration["AppSettings:HostAddress"]); 
} 
+0

うん、これは適切なソリューションであると、私は、構築されたIServiceCollectionオブジェクトと呼び出しサービスで使用して終了しました。コンフィグレーション(configuration.GetSection( "コンフィグレーション"));次にservices.AddSingleton(構成)。しかし、このアプローチはよりクリーンです。 RegisterModule(ConfigurationModule)がほとんど何もしていないのは奇妙なことです。 –

関連する問題