tôi có các dịch vụ đó được bắt nguồn từ cùng một giao diệnLàm thế nào để đăng ký nhiều triển khai của cùng một giao diện trong Asp.Net Core?
public interface IService
{
}
public class ServiceA : IService
{
}
public class ServiceB : IService
{
}
public class ServiceC : IService
{
}
container IOC thường khác như Unity
phép bạn đăng ký triển khai cụ thể của một số Key
mà phân biệt chúng.
Trong Asp.Net Core, làm cách nào để đăng ký các dịch vụ này và giải quyết trong thời gian chạy dựa trên một số khóa?
Tôi không thấy bất kỳ phương pháp nào trong số Add
Dịch vụ có tham số key
hoặc name
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 here of the same interface
}
public MyController:Controller
{
public void DoSomeThing(string key)
{
// How do get service based on key
}
}
Mẫu nhà máy là tùy chọn duy nhất ở đây?
Update1
Tôi đã đi mặc dù bài viết here cho thấy làm thế nào để sử dụng mô hình nhà máy để có được các trường hợp dịch vụ khi chúng tôi có nhiều thi concreate. Tuy nhiên nó vẫn không phải là giải pháp hoàn chỉnh. khi tôi gọi phương thức _serviceProvider.GetService()
tôi không thể tiêm dữ liệu vào hàm tạo. Ví dụ: xem xét ví dụ 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 cách nào để có thể kết nối chuỗi thích hợp? Trong Unity hoặc bất kỳ IOC nào khác, chúng tôi có thể làm điều đó tại thời điểm đăng ký loại. Tôi có thể sử dụng IOption tuy nhiên điều đó sẽ yêu cầu tôi phải tiêm tất cả các thiết lập, tôi không thể tiêm một chuỗi kết nối cụ thể vào dịch vụ. Cũng cần lưu ý rằng tôi đang cố gắng tránh sử dụng các vật chứa 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 thùng chứa mới là tốt.
Cũng sử dụng mô hình nhà máy để tạo ra ví dụ dịch vụ là chống lại DIP như nhà máy tăng số lượng phụ thuộc một khách hàng buộc phải phụ thuộc vào details here
Vì vậy, tôi nghĩ mặc định DI trong ASP.NET lõi thiếu 2 điều
1> đăng ký các trường hợp sử dụng khóa
2> Tiêm dữ liệu tĩnh vào constructor trong đăng ký
có thể trùng lặp của [Dependency Injection giải quyết theo tên] (http://stackoverflow.com/questions/39072001/dependency-injection -ký-by-name) –
Cuối cùng cũng có [phần mở rộng trong nuget] (https://www.nuget.org/packages/Neleus.DependencyInjection.Extensions) để đăng ký dựa trên tên, hy vọng nó có thể giúp – neleus
Xin chào, xin lỗi cho câu hỏi ngu ngốc của tôi, nhưng tôi mới về với Microso ft.Extensions.DependencyInjection ... bạn có nghĩ rằng tạo ra 3 giao diện trống để mở rộng Iservice như "giao diện công cộng IServiceA: IService" và hơn "public class ServiceA: IServiceA" ... có thể là một lựa chọn thực hành tốt không? –