我尝试为我的服务“FdmMediator”创建自己的 ServiceCollectionExtension。
我想将服务“FdmMediator”注册为单例,并且需要传递一些参数。参数也提前注入到容器中。
创建“FdmMediator”所需的参数是 ILoggerFactory、从 appsetting.json 和存储库加载的设置。
我使用 serilog 作为应用程序记录器,并将 appsetting.json 中的应用程序设置保存为
IOption<GlobalSettings>
。
// Logger
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(builder.Configuration)
.CreateLogger();
builder.Logging.AddSerilog();
// application settings
builder.Services.Configure<GlobalSettings>(builder.Configuration.GetSection("ApplicationSettings"));
// Where I want to use my extensions
builder.Services.AddFdmMediator()
// Other code...
var app = builder.Build();
// ...
稍后在代码中我在容器中注册我的存储库
builder.Services.AddTransient<IApplicationTraceRepository, ApplicationTraceRepository>();
要创建 FdmMediator 类的新实例,我需要传递注册的参数。
public class FdmMediator
{
private readonly ILogger _logger;
private readonly IApplicationTraceRepository _errorRepository;
private readonly GlobalSettings _settings;
public FdmMediator(ILogger logger, IApplicationTraceRepository errorRepository, IOptions<GlobalSettings> s)
{
_logger = logger;
_errorRepository = errorRepository;
_settings = s.Value;
}
}
在我的 IServiceCollection 扩展中,我想根据programm.cs中配置的 serilog 记录器创建一个新记录器。
public static class FdmMediatorBuilderExtensions
{
public static IServiceCollection AddFdmMediator(this IServiceCollection services, ILoggerFactory factory, IApplicationTraceRepository rep, IOptions<GlobalSettings> settings)
{
// Create Mediator
// The logger factory should create a new serilog-logger based on the same settings as configured in the programm.cs
var l = factory.CreateLogger(nameof(FdmMediator));
var m = new FdmMediator(l, rep, settings);
// Add as singleton
services.AddSingleton<FdmMediator>(m);
return services;
}
}
我应该怎么做才能从容器中获取参数并传递它们,以将我的“FdmMediator”创建为单例?我如何从之前创建的 Serilogger 中获取 ILoggerFactory。
在这种情况下不需要扩展方法。所有构造函数参数都已注册。唯一的问题是记录器依赖项的类型是
ILogger
而不是 ILogger<FdmMediator>
。日志中间件将使用类型的名称作为日志消息的类别。
如果将构造函数签名更改为:
public FdmMediator(ILogger<FdmMediator> logger,
IApplicationTraceRepository errorRepository,
IOptions<GlobalSettings> s)
您应该能够注册课程:
services.AddSingleton<FdmMediator>();