IServiceCollectionArayüzü için kullanılan yapı , bir bağımlılık enjeksiyon kap. Tamamen oluşturulduktan sonra, IServiceProviderhizmetleri çözmek için kullanabileceğiniz bir örneğe göre oluşturulur. IServiceProviderHerhangi bir sınıfa bir enjekte edebilirsiniz . IApplicationBuilderVe HttpContextsınıflar ile, hem servis sağlayıcı sağlayabilir ApplicationServicesya da RequestServicessırasıyla özellikleri.
IServiceProviderGetService(Type type)bir servisi çözmek için bir yöntem tanımlar :
var service = (IFooService)serviceProvider.GetService(typeof(IFooService));
Ayrıca, serviceProvider.GetService<IFooService>()( usingfor a ekle Microsoft.Extensions.DependencyInjection) gibi çeşitli kolaylık genişletme yöntemleri de vardır .
Başlangıç sınıfı içindeki hizmetleri çözümleme
Enjeksiyon bağımlılıkları
Çalışma zamanının barındırma hizmeti sağlayıcısı yapıcı içine belirli hizmetleri enjekte Startupgibi sınıf, IConfiguration,
IWebHostEnvironment( IHostingEnvironment3.0'dan sürümlerinde), ILoggerFactoryve IServiceProvider. İkincisinin barındırma katmanı tarafından oluşturulan bir örnek olduğunu ve yalnızca bir uygulamayı başlatmak için gerekli hizmetleri içerdiğini unutmayın .
ConfigureServices()Yöntem sadece bir kabul, hizmetlerini enjekte izin vermez IServiceCollectionargüman. Bu mantıklıdır çünkü ConfigureServices()uygulamanızın gerektirdiği hizmetleri kaydettiğiniz yer burasıdır. Ancak, burada başlangıç yapıcısına enjekte edilen hizmetleri kullanabilirsiniz, örneğin:
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
// Use Configuration here
}
Kayıtlı herhangi bir hizmet ConfigureServices()daha sonra Configure()yönteme enjekte edilebilir ; şu IApplicationBuilderparametreden sonra isteğe bağlı sayıda hizmet ekleyebilirsiniz :
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IFooService>();
}
public void Configure(IApplicationBuilder app, IFooService fooService)
{
fooService.Bar();
}
Bağımlılıkları elle çözme
Hizmetleri el ile çözümlemeniz gerekiyorsa, tercihen aşağıdaki yöntemle ApplicationServicessağlananları kullanmalısınız :IApplicationBuilderConfigure()
public void Configure(IApplicationBuilder app)
{
var serviceProvider = app.ApplicationServices;
var hostingEnv = serviceProvider.GetService<IHostingEnvironment>();
}
Sınıfınızın IServiceProvideryapıcısında bir geçmek ve doğrudan kullanmak mümkündür Startup, ancak yukarıdaki gibi bu sınırlı bir hizmet alt kümesi içerecektir ve bu nedenle sınırlı faydaya sahiptir:
public Startup(IServiceProvider serviceProvider)
{
var hostingEnv = serviceProvider.GetService<IWebHostEnvironment>();
}
ConfigureServices()Yöntemdeki hizmetleri çözümlemeniz gerekiyorsa , farklı bir yaklaşım gerekir. Sen bir ara inşa edebilirsiniz IServiceProviderdan IServiceCollectiontescil edilmiştir hizmetlerini içeren örneğine o noktaya kadar :
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IFooService, FooService>();
// Build the intermediate service provider
var sp = services.BuildServiceProvider();
// This will succeed.
var fooService = sp.GetService<IFooService>();
// This will fail (return null), as IBarService hasn't been registered yet.
var barService = sp.GetService<IBarService>();
}
Lütfen dikkat:
Genellikle uygulama içindeki hizmetleri yapılandırdığınızConfigureServices() yer olduğu için hizmetleri yöntem içinde çözmekten kaçınmalısınız . Bazen sadece bir örneğe erişmeniz gerekir . Bunu örnekten bir örneğe bağlayarak (esas olarak seçenekler çerçevesinin yaptığı şeydir) bunu yapabilirsiniz:IOptions<MyOptions>IConfigurationMyOptions
public void ConfigureServices(IServiceCollection services)
{
var myOptions = new MyOptions();
Configuration.GetSection("SomeSection").Bind(myOptions);
}
Hizmetleri manuel olarak çözümlemek (Servis Bulucu olarak da bilinir) genellikle bir anti-desen olarak kabul edilir . Kullanım durumları olsa da (çerçeveler ve / veya altyapı katmanları için) mümkün olduğunca kaçınmalısınız.