在已经依赖注入的类中再进行一次依赖注入

时间:2020-09-30 09:27:58

标签: c# dependency-injection nlog

我在.net核心上编写控制台应用程序,并希望将Nlog添加到类中。我在程序类中添加了依赖注入

public static async Task Main(string[] args)
{
   var logger = LogManager.GetCurrentClassLogger();

   try
   {
      var configuration = GetConfiguration("app.config");
      var serviceProvider = BuildDI(configuration);

      using (serviceProvider as IDisposable)
      {
         var tcpController = serviceProvider.GetRequiredService<TcpController>();
         var median = await tcpController.GetMedian();

         Console.WriteLine(median.ToString());
      }
   }
   catch (Exception ex)
   {
      logger.Error(ex);
      throw;
   }
   finally
   {
      LogManager.Shutdown();
   }   
}

我通过这种方法生成ServiceProvider

private static IServiceProvider BuildDI(IConfiguration config)
{
   return new ServiceCollection()
      .AddSingleton<IConfiguration>(config)
      .AddSingleton<TcpController>()
      .AddLogging(loggingBuilder =>
      {
         loggingBuilder.ClearProviders();
         loggingBuilder.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
         loggingBuilder.AddNLog(config);
      })
      .BuildServiceProvider();
}

private static IConfiguration GetConfiguration(string configName)中,所有逻辑生成配置对象。我想我们不需要这个代码来解决这个问题。

TcpController中,我得到了在构造函数中创建的private TcpRepository _tcpRepository { get; }字段。

public TcpController(IConfiguration configuration, ILogger<TcpController> logger)
{
   this._configuration = configuration;
   this._logger = logger;
   this._tcpRepository = new TcpRepository(configuration);
}

我想像Transient这样使用它。我必须在TcpController中重复方法private static IServiceProvider BuildDI(IConfiguration config)或在C#中,我们有另一种方法可以做到这一点?

0 个答案:

没有答案