var builder = WebApplication.CreateBuilder(args);
// Register multiple keyed services for the ICustomLogger interface
builder.Services.AddKeyedScoped("file");
builder.Services.AddKeyedScoped("database");
builder.Services.AddKeyedScoped("event");
var app = builder.Build();
Observe como o FileLogger, DatabaseLoggere EventLogger os serviços são registrados usando as chaves "file", "database"e "event"respectivamente.
Injete os serviços do logger com chave
Podemos usar o (FromKeyedServices) atributo para injetar uma implementação específica de nosso serviço de logger em nossos endpoints mínimos de API, conforme mostrado no trecho de código fornecido abaixo.
app.MapGet("/customlogger/file", ((FromKeyedServices("file")) ICustomLogger fileLogger) =>
{
fileLogger.Log("This text is written to the file system.");
return Results.Ok("File logger executed successfully.");
});
app.MapGet("/customlogger/db", ((FromKeyedServices("database")) ICustomLogger databaseLogger) =>
{
databaseLogger.Log("This text is stored in the database.");
return Results.Ok("Database logger executed successfully.");
});
app.MapGet("/customlogger/event", ((FromKeyedServices("event")) ICustomLogger logger) =>
{
logger.Log("This text is recorded in the event system.");
return Results.Ok("Event logger executed successfully.");
});
Assim, usando DI e serviços com chave, podemos implementar cada um de nossos serviços de logger uma vez e, em seguida, simplesmente solicitar o tipo certo de logger quando precisarmos, sem ter que usar uma fábrica para instanciar o logger. E sempre que quisermos trocar as implementações – de FileLogger para DatabaseLoggerpor exemplo – tudo o que precisamos fazer é alterar a configuração que especificamos ao registrar os serviços no contêiner. O sistema DI conectará o registrador correto automaticamente em tempo de execução.
