ฉันมีบริการที่ได้มาจากอินเทอร์เฟซเดียวกัน
public interface IService { }
public class ServiceA : IService { }
public class ServiceB : IService { }
public class ServiceC : IService { }
โดยทั่วไปแล้วคอนเทนเนอร์ IoC อื่น ๆ เช่นUnity
อนุญาตให้คุณลงทะเบียนการใช้งานที่เป็นรูปธรรมโดยบางส่วนKey
ที่แตกต่าง
ใน ASP.NET Core ฉันจะลงทะเบียนบริการเหล่านี้อย่างไรและแก้ไขได้ที่ runtime ตามคีย์บางตัว
ฉันไม่เห็นAdd
วิธีการบริการใด ๆที่ใช้พารามิเตอร์key
หรือname
ซึ่งมักจะใช้เพื่อแยกความแตกต่างของการใช้งานที่เป็นรูปธรรม
public void ConfigureServices(IServiceCollection services)
{
// How do I register services of the same interface?
}
public MyController:Controller
{
public void DoSomething(string key)
{
// How do I resolve the service by key?
}
}
รูปแบบจากโรงงานเป็นตัวเลือกเดียวที่นี่หรือไม่
Update1
ฉันได้ไป แต่บทความที่นี่ที่แสดงให้เห็นถึงวิธีการที่จะใช้รูปแบบโรงงานที่จะได้รับบริการกรณีเมื่อเรามีการใช้งานที่เป็นรูปธรรมหลาย อย่างไรก็ตามมันก็ยังไม่เป็นทางออกที่สมบูรณ์ เมื่อฉันเรียก_serviceProvider.GetService()
เมธอดฉันไม่สามารถฉีดข้อมูลลงในตัวสร้าง
ตัวอย่างเช่นพิจารณาสิ่งนี้:
public class ServiceA : IService
{
private string _efConnectionString;
ServiceA(string efconnectionString)
{
_efConnecttionString = efConnectionString;
}
}
public class ServiceB : IService
{
private string _mongoConnectionString;
public ServiceB(string mongoConnectionString)
{
_mongoConnectionString = mongoConnectionString;
}
}
public class ServiceC : IService
{
private string _someOtherConnectionString
public ServiceC(string someOtherConnectionString)
{
_someOtherConnectionString = someOtherConnectionString;
}
}
จะ_serviceProvider.GetService()
ฉีดสตริงการเชื่อมต่อที่เหมาะสมได้อย่างไร ใน Unity หรือไลบรารี IoC อื่น ๆ เราสามารถทำได้ที่การลงทะเบียนประเภท ฉันสามารถใช้IOptionได้ แต่นั่นจะทำให้ฉันต้องฉีดการตั้งค่าทั้งหมด ฉันไม่สามารถฉีดสตริงการเชื่อมต่อเฉพาะลงในบริการได้
โปรดทราบว่าฉันกำลังพยายามหลีกเลี่ยงการใช้คอนเทนเนอร์อื่น ๆ (รวมถึง Unity) เพราะฉันต้องลงทะเบียนทุกอย่าง (เช่นตัวควบคุม) ด้วยคอนเทนเนอร์ใหม่เช่นกัน
นอกจากนี้การใช้รูปแบบโรงงานที่จะสร้างอินสแตนซ์บริการกับกรมทรัพย์สินทางปัญญาเป็นมันจะเพิ่มจำนวนการอ้างอิงลูกค้ามีรายละเอียดที่นี่
ดังนั้นฉันคิดว่า DI เริ่มต้นใน ASP.NET Core ขาดสองสิ่ง:
- ความสามารถในการลงทะเบียนอินสแตนซ์โดยใช้กุญแจ
- ความสามารถในการฉีดข้อมูลคงที่ลงในตัวสร้างระหว่างการลงทะเบียน
Update1
ย้ายไปยังคำถามที่แตกต่างกันเนื่องจากการฉีดสิ่งต่าง ๆ ในตัวสร้างแตกต่างกันมากจากการทำงานจากสิ่งที่วัตถุที่จะสร้าง