Tôi có các dịch vụ có nguồn gốc từ cùng một giao diện.
public interface IService { }
public class ServiceA : IService { }
public class ServiceB : IService { }
public class ServiceC : IService { }
Thông thường, các bộ chứa IoC khác như Unity
cho phép bạn đăng ký triển khai cụ thể bằng một số cách Key
phân biệt chúng.
Trong ASP.NET Core, làm cách nào để tôi đăng ký các dịch vụ này và giải quyết chúng khi chạy dựa trên một số khóa?
Tôi không thấy bất kỳ Add
phương thức Dịch vụ nào có tham số key
hoặc name
tham số, thường được sử dụng để phân biệt việc triển khai cụ thể.
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?
}
}
Có phải mẫu Factory là lựa chọn duy nhất ở đây?
Update1
Tôi đã đi qua bài viết ở đây chỉ ra cách sử dụng mẫu nhà máy để lấy các phiên bản dịch vụ khi chúng ta có nhiều triển khai cụ thể. Tuy nhiên, nó vẫn chưa phải là một giải pháp hoàn chỉnh. Khi tôi gọi _serviceProvider.GetService()
phương thức, tôi không thể tiêm dữ liệu vào hàm tạo.
Ví dụ, hãy xem xét điều này:
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;
}
}
Làm thế nào có thể _serviceProvider.GetService()
tiêm chuỗi kết nối thích hợp? Trong Unity hoặc bất kỳ thư viện IoC nào khác, chúng tôi có thể làm điều đó khi đăng ký loại. Tôi có thể sử dụng IOption , tuy nhiên, điều đó sẽ yêu cầu tôi tiêm tất cả các cài đặt. Tôi không thể tiêm một chuỗi kết nối cụ thể vào dịch vụ.
Cũng lưu ý rằng tôi đang cố gắng tránh sử dụng các container khác (bao gồm cả Unity) vì sau đó tôi phải đăng ký mọi thứ khác (ví dụ: Bộ điều khiển) với container mới.
Ngoài ra, sử dụng mẫu nhà máy để tạo các phiên bản dịch vụ là chống lại DIP, vì nó làm tăng số lượng phụ thuộc mà khách hàng có chi tiết ở đây .
Vì vậy, tôi nghĩ rằng DI mặc định trong ASP.NET Core thiếu hai điều:
- Khả năng đăng ký cá thể bằng khóa
- Khả năng tiêm dữ liệu tĩnh vào các nhà xây dựng trong quá trình đăng ký
Update1
được chuyển sang một câu hỏi khác vì việc đưa mọi thứ vào các nhà xây dựng rất khác với việc tìm ra đối tượng nào sẽ xây dựng