IServiceCollection
Arayüzü için kullanılan yapı , bir bağımlılık enjeksiyon kap. Tamamen oluşturulduktan sonra, IServiceProvider
hizmetleri çözmek için kullanabileceğiniz bir örneğe göre oluşturulur. IServiceProvider
Herhangi bir sınıfa bir enjekte edebilirsiniz . IApplicationBuilder
Ve HttpContext
sınıflar ile, hem servis sağlayıcı sağlayabilir ApplicationServices
ya da RequestServices
sırasıyla özellikleri.
IServiceProvider
GetService(Type type)
bir servisi çözmek için bir yöntem tanımlar :
var service = (IFooService)serviceProvider.GetService(typeof(IFooService));
Ayrıca, serviceProvider.GetService<IFooService>()
( using
for 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 Startup
gibi sınıf, IConfiguration
,
IWebHostEnvironment
( IHostingEnvironment
3.0'dan sürümlerinde), ILoggerFactory
ve 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 IServiceCollection
argü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 IApplicationBuilder
parametreden 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 ApplicationServices
sağlananları kullanmalısınız :IApplicationBuilder
Configure()
public void Configure(IApplicationBuilder app)
{
var serviceProvider = app.ApplicationServices;
var hostingEnv = serviceProvider.GetService<IHostingEnvironment>();
}
Sınıfınızın IServiceProvider
yapı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 IServiceProvider
dan IServiceCollection
tescil 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>
IConfiguration
MyOptions
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.