Tento criar meu próprio ServiceCollectionExtension para o meu serviço 'FdmMediator'.
Quero cadastrar o serviço 'FdmMediator' como singleton, e preciso passar alguns parâmetros. Os parâmetros também são injetados anteriormente no contêiner.
Os parâmetros necessários para criar o 'FdmMediator' são um ILoggerFactory, configurações carregadas de appsetting.json e um repositório.
Eu uso serilog como registrador de aplicativo e salvo a configuração do aplicativo em appsetting.json como um arquivo 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();
// ...
Posteriormente no código eu registro meu repositório no container
builder.Services.AddTransient<IApplicationTraceRepository, ApplicationTraceRepository>();
Para criar uma nova instância da classe FdmMediator preciso passar os parâmetros cadastrados.
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;
}
}
Na minha extensão IServiceCollection, desejo criar um novo criador de logs com base no criador de logs serilog configurado no programm.cs.
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;
}
}
O que devo fazer para obter os parâmetros do contêiner e passá-los, para criar meu 'FdmMediator' como singleton? E como posso obter um ILoggerFactory do meu Serilogger criado anteriormente.
Não há necessidade de um método de extensão neste caso. Todos os parâmetros do construtor já estão registrados. O único problema é que o tipo de dependência do criador de logs é
ILogger
em vez deILogger<FdmMediator>
. A documentação do ILogger explica que:Se você alterar a assinatura do construtor para isto:
Você deve ser capaz de registrar a turma com apenas: