0

그래서 Autofac DI를 사용하여 구성 json 파일을 스택을 통해 전달하려고합니다. 다음과 같이 내 주요 기능은 다음과 같습니다 내 BusModule이로드 옆에 내가 성공적으로 ... 여기에 모듈을 등록ConfigurationModule이 모듈 및 컨텍스트에 전달됨 - DotNet 코어

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 ("Configuration"))을 구성하십시오. 그런 다음 services.AddSingleton (구성); 그러나이 방법은 더 깨끗합니다. 나는 RegisterModule (ConfigurationModule)이 거의 아무것도하지 않는다는 것을 이상하게 생각한다! –

관련 문제