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 บริการส) ด้วยตนเองโดยทั่วไปถือว่าต่อต้านรูปแบบ ในขณะที่มีกรณีใช้งาน (สำหรับกรอบและ / หรือชั้นโครงสร้างพื้นฐาน) คุณควรหลีกเลี่ยงให้มากที่สุด