É possível resolver uma instância de IOptions<AppSettings>
do ConfigureServices
método na inicialização? Normalmente, você pode usar IServiceProvider
para inicializar instâncias, mas não o tem nesta fase quando está registrando serviços.
public void ConfigureServices(IServiceCollection services)
{
services.Configure<AppSettings>(
configuration.GetConfigurationSection(nameof(AppSettings)));
// How can I resolve IOptions<AppSettings> here?
}
c#
asp.net-core
inversion-of-control
asp.net-core-mvc
Muhammad Rehan Saeed
fonte
fonte
ConfigureServices
método.BuildServiceProvider
causa um aviso se usado no código do aplicativo, comoConfigureServices
resulta em uma cópia adicional dos serviços singleton sendo criada. A resposta de Ehsan Mirsaeedi aqui é a solução mais ideal para casos como este.A melhor maneira de instanciar classes que dependem de outros serviços é usar a sobrecarga Add XXX que fornece o IServiceProvider . Dessa forma, você não precisa instanciar um provedor de serviços intermediário.
Os exemplos a seguir mostram como você pode usar essa sobrecarga nos métodos AddSingleton / AddTransient .
fonte
A maneira mais simples e correta de conseguir isso, em todas as versões do ASP.NET Core , é implementar o
IConfigureOptions<TOptions>
interface. Embora isso exista desde o .NET Core 1.0, parece que poucas pessoas sabem como ele faz as coisas Just Work ™.Por exemplo, você deseja adicionar um validador de modelo personalizado que dependa de um dos outros serviços do seu aplicativo. Inicialmente, parece impossível - não há como resolver
IMyServiceDependency
porque você não tem acesso aIServiceProvider
:Mas a "mágica" de
IConfigureOptions<TOptions>
torna isso tão fácil:Essencialmente, qualquer configuração que você teria feito nos
Add***(***Options)
delegadosConfigureServices
agora é movida para a suaIConfigureOptions<TOptions>
classeConfigure
método . Então você registra as opções da mesma forma que registraria qualquer outro serviço, e pronto!Para obter mais detalhes, bem como informações sobre como isso funciona nos bastidores, indico o sempre excelente Andrew Locke .
fonte
Você está procurando algo como seguir? Você pode dar uma olhada em meus comentários no código:
fonte
Quer ajudar outras pessoas que têm a mesma aparência, mas também usam o Autofac.
Se você quiser obter ILifetimeScope (ou seja, o contêiner do escopo atual), você precisa chamar o
app.ApplicationServices.GetAutofacRoot()
métodoConfigure(IApplicationBuilder app)
neste retornará a instância ILifetimeScope que você pode usar para resolver os serviçosfonte