ฉันกำลังอ่านหนังสือที่แสดงให้เห็นว่า Dependency Injection ทำงานอย่างไรเมื่อใช้ฟังก์ชันโรงงาน โค้ดด้านล่างคือ:
//MemoryRepository implements IRepository
public class Startup
{
private IHostingEnvironment env;
public Startup(IHostingEnvironment hostEnv) => env = hostEnv;
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IRepository>(provider =>
{
if (env.IsDevelopment())
{
var x = provider.GetService<MemoryRepository>();
return x;
}
else
{
return new XXX(); //return sth else;
}
});
services.AddTransient<MemoryRepository>();
...//register other components which are dependencies of MemoryRepository
services.AddMvc();
}
...
}
ฉันไม่รู้ว่าทำไม services.AddTransient<MemoryRepository>();
ถึงจำเป็น?
เนื่องจาก services.AddTransient<IRepository>{...}
กำหนดขอบเขต "ชั่วคราว" ไว้แล้ว ซึ่งหมายความว่า "ทุกครั้งที่จำเป็นต้องใช้ IRepository จะมีการจัดหาออบเจ็กต์ MemoryRepository ใหม่ (หากเป็นสภาพแวดล้อมการพัฒนา)" ดังนั้นทุกอย่างจะได้รับการตั้งค่า การขึ้นต่อกันอื่น ๆ ของ MemoryRepository จะถูกจัดการ โดยการลงทะเบียนดังต่อไปนี้
Q1-แล้วทำไมเราถึงยังต้องมี services.AddTransient<MemoryRepository>();
อีกครั้ง? ถ้าฉันแสดงความคิดเห็น แอปพลิเคชันไม่สามารถทำงานได้ ดังนั้นจึงจำเป็นต้องใช้คำสั่งนี้ ฉันไม่รู้ว่าทำไม
Q2- ถ้าฉันแก้ไข configurationServices เป็น:
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IRepository, MemoryRepository>();
...
}
แอปพลิเคชันทำงานได้สำเร็จ แล้วทำไมในกรณีนี้ ฉันไม่จำเป็นต้องเพิ่ม services.AddTransient<MemoryRepository>();
เป็น:
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IRepository, MemoryRepository>();
services.AddTransient<MemoryRepository>();
...
}