IServiceCollectionอินเตอร์เฟซที่ใช้สำหรับการสร้างภาชนะฉีดพึ่งพา หลังจากสร้างเสร็จสมบูรณ์แล้วมันจะประกอบไปด้วยIServiceProviderอินสแตนซ์ที่คุณสามารถใช้เพื่อแก้ไขบริการ คุณสามารถฉีดIServiceProviderเข้าไปในชั้นเรียนใดก็ได้ IApplicationBuilderและHttpContextเรียนสามารถให้ผู้ให้บริการเช่นกันผ่านทางของพวกเขาApplicationServicesหรือRequestServicesคุณสมบัติตามลำดับ
IServiceProviderกำหนดGetService(Type type)วิธีการแก้ปัญหาบริการ:
var service = (IFooService)serviceProvider.GetService(typeof(IFooService));
นอกจากนี้ยังมีวิธีการขยายความสะดวกหลายอย่างเช่นserviceProvider.GetService<IFooService>()(เพิ่มusingสำหรับMicrosoft.Extensions.DependencyInjection)
การแก้ไขบริการภายในคลาสเริ่มต้น
การฉีดการพึ่งพา
โฮสติ้งผู้ให้บริการรันไทม์สามารถฉีดบริการบางอย่างลงในตัวสร้างของStartupระดับเช่นIConfiguration,
IWebHostEnvironment( IHostingEnvironmentใน pre-3.0 รุ่น) และILoggerFactory IServiceProviderหมายเหตุว่าหลังเป็นตัวอย่างที่สร้างขึ้นโดยชั้นโฮสติ้งและมีเพียงบริการที่จำเป็นสำหรับการเริ่มต้นขึ้นแอพลิเคชัน
ConfigureServices()วิธีการไม่อนุญาตให้บริการฉีดก็ยอมรับIServiceCollectionข้อโต้แย้ง สิ่งนี้สมเหตุสมผลเนื่องจากConfigureServices()เป็นสถานที่ที่คุณลงทะเบียนบริการตามที่แอปพลิเคชันของคุณต้องการ อย่างไรก็ตามคุณสามารถใช้บริการต่าง ๆ ในตัวสร้างของการเริ่มต้นที่นี่ตัวอย่างเช่น:
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
// Use Configuration here
}
บริการใด ๆ ที่ลงทะเบียนในConfigureServices()นั้นจะถูกฉีดเข้าไปในConfigure()วิธีการนั้น คุณสามารถเพิ่มจำนวนบริการโดยพลการหลังจากIApplicationBuilderพารามิเตอร์:
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IFooService>();
}
public void Configure(IApplicationBuilder app, IFooService fooService)
{
fooService.Bar();
}
การแก้ไขการอ้างอิงด้วยตนเอง
หากคุณต้องการให้การบริการและการแก้ปัญหาด้วยตนเองคุณควรใช้ApplicationServicesให้บริการโดยIApplicationBuilderในConfigure()วิธีการ:
public void Configure(IApplicationBuilder app)
{
var serviceProvider = app.ApplicationServices;
var hostingEnv = serviceProvider.GetService<IHostingEnvironment>();
}
เป็นไปได้ที่จะผ่านและใช้โดยตรงIServiceProviderในตัวสร้างStartupคลาสของคุณแต่เนื่องจากข้างต้นนี้จะมีชุดย่อยของการบริการที่จำกัด ดังนั้นจึงมียูทิลิตี้ที่ จำกัด :
public Startup(IServiceProvider serviceProvider)
{
var hostingEnv = serviceProvider.GetService<IWebHostEnvironment>();
}
หากคุณต้องแก้ไขบริการในConfigureServices()วิธีการนั้นจำเป็นต้องใช้วิธีการอื่น คุณสามารถสร้างสื่อกลางIServiceProviderจากIServiceCollectionอินสแตนซ์ที่มีบริการที่ลงทะเบียนจนถึงจุดนั้น :
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>();
}
โปรดทราบ:
โดยทั่วไปคุณควรหลีกเลี่ยงการแก้ไขบริการภายในConfigureServices()วิธีนี้เนื่องจากเป็นสถานที่ที่คุณกำหนดค่าแอปพลิเคชันบริการ บางครั้งคุณต้องเข้าถึงIOptions<MyOptions>อินสแตนซ์ คุณสามารถทำได้โดยผูกค่าจากIConfigurationอินสแตนซ์กับอินสแตนซ์ของMyOptions(ซึ่งเป็นสิ่งสำคัญที่เฟรมเวิร์กตัวเลือกทำ):
public void ConfigureServices(IServiceCollection services)
{
var myOptions = new MyOptions();
Configuration.GetSection("SomeSection").Bind(myOptions);
}
การแก้ปัญหาการให้บริการ (aka บริการส) ด้วยตนเองโดยทั่วไปถือว่าต่อต้านรูปแบบ ในขณะที่มีกรณีใช้งาน (สำหรับกรอบและ / หรือชั้นโครงสร้างพื้นฐาน) คุณควรหลีกเลี่ยงให้มากที่สุด