0

Also ich versuche Autofac DI zu verwenden, um meine Konfiguration JSON-Datei durch den Stapel zu übergeben. Meine Hauptfunktion ist wie folgt:ConfigurationModule in Modul und Kontext übergeben - 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(); 
} 

ich erfolgreich die Module hier registriert haben ... weiter mein Busteilnehmers geladen ...

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

Meine BusSettings Klasse dann aufgelöst wird, aber das ist, wo ich will, dass die Konfigurationsdatei verwendet werden, um die Eigenschaften zu gründen, ist die Frage, die ich weiß nicht, wie die Konfigurationsdatei von dort zuzugreifen ...

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

Kennt jemand den richtigen Weg, dies zu tun?

Antwort

0

Sie müssen einfach configBuilder.Build() als IConfiguration mit Autofac registrieren und Sie sind gut zu gehen. So wäre es etwa wie folgt aussehen:

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

Mit der BusSettings Klasse wie folgt umgesetzt:

public class BusSettings 
{ 
    private readonly IConfiguration _configuration; 

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

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

Ja das ist die richtige Lösung, landete ich mit dem eingebauten IServiceCollection Objekt und Anrufdienste. Konfigurieren Sie (configuration.GetSection ("Configuration")); und dann services.AddSingleton (Konfiguration); Dieser Ansatz ist jedoch sauberer. Ich finde es komisch, dass das RegisterModule (ConfigurationModule) so ziemlich nichts macht! –