我在.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#中,我们有另一种方法可以做到这一点?