我有一个C#.NET7库,由其他带有扩展方法的WPF/控制台应用程序初始化.库不链接到任何外部日志(log)提供程序,但必须使用主应用程序授予的提供程序.在库服务(如MyLibService1、MyLibService2)中,ILogger<>
的依赖项注入效果很好.问题在于登录扩展方法.
以下是库的简化初始化代码:
public static class AddMyLibraryExtensions
{
public static HostApplicationBuilder AddMyLibrary(this HostApplicationBuilder builder)
{
var libConfiguration = builder.Configuration.GetRequiredSection("MyLibrary");
builder.Services.AddOptions<MyLibrarySettings>()
.Bind(libConfiguration);
builder.Services.TryAddTransient<IMyLibService1, MyLibService1>();
builder.Services.TryAddTransient<IMyLibService2, MyLibService2>();
var libSettings = libConfiguration.Get<MyLibrarySettings>();
builder.Services.AddDbContext<MyLibDbContext>(opts =>
{
opts.UseSqlite(libSettings.ConnectionString);
});
return builder;
}
}
它在应用程序中的使用是这样的(CreateApplicationBuilder()有很多好处,所以这里使用它):
static void Main(string[] args)
{
var builder = Host.CreateApplicationBuilder();
builder.Services.AddTransient<IAppService1, AppService1>();
builder.Services.AddTransient<IAppService2, AppService2>();
builder.AddMyLibrary(); // My library may be added here...
builder.Services.AddLogging(cfg =>
{
var logConf = new LoggerConfiguration()
.ReadFrom.Configuration(builder.Configuration)
.CreateLogger();
Log.Logger = logConf;
cfg.AddSerilog(logConf); // for example Serilog
});
// builder.AddLibrary(); // or here...
var host = builder.Build();
var job = host.Services.GetService<IAppService1>();
job.DoWork();
}
因此,库不知道何时添加日志(log)记录(如果有的话)、添加哪个提供者以及在其扩展方法中不能使用依赖项注入,而且在构建主机之前不能使用主机的ServiceLocator
是否有任何方法可以在AddMyLibrary方法中使用应用程序日志(log)记录(如果有)?
目前,我将One-Send应用程序记录器作为扩展方法的参数,如.AddMyLibrary(对象记录器). 有点难看.