Tôi khá mới đối với Ninject, nhưng tôi đã quản lý thành công để sử dụng nó cho DI sử dụng nhà cung cấp tùy chỉnh.Ninject, Providers và Activator.CreateInstance
Các ràng buộc được khởi tạo như sau
kernel = new StandardKernel();
kernel.Bind<IPatientRecordLocator>().ToProvider<PatientRecordLocatorProvider>();
và trong các nhà cung cấp tùy chỉnh tôi gọi Activator.CreateInstance như vậy
protected override IPatientRecordLocator CreateInstance(IContext context)
{
var name = ConfigurationManager.AppSettings["PatientRecordLocator"];
var typeName = name.Split(',')[0];
var assemblyName = name.Split(',')[1];
return Activator.CreateInstance(assemblyName, typeName).Unwrap() as IPatientRecordLocator;
}
(vâng, tôi biết rằng không có xử lý lỗi, vv . trong mã bên trên :))
và tất cả điều này hoạt động như một sự quyến rũ.
Bây giờ, vấn đề tôi đang gặp phải là khi tôi giới thiệu một lớp mới mà tôi muốn đưa vào các phiên bản của IPatientRecordLocator. Vấn đề xảy ra khi tôi thêm một hàm tạo như sau, ví dụ: một trong những lớp
[Inject]
public MockPatientRecordLocator (IContactAdapter contactAdapter)
{
...
}
Sau đó, cho Activator.CreateInstance để làm việc tôi cũng có thêm một constructor parameterless đến lớp MockPatientRecordLocator, tức là
public MockPatientRecordLocator()
{
}
Vì vậy, câu hỏi của tôi là: làm thế nào tôi có thể làm Ninject tiêm một thể hiện của một lớp thực hiện IContactAdapter vào ví dụ MockPatientRecordLocator? Tôi đã thử phương pháp tiêm, nhưng vô ích. Tôi quên để giải thích rằng những gì tôi đang cố gắng để đạt được là một loại tiêm chuỗi nơi một thể hiện của lớp PatientRecordSummary được tiêm với một thể hiện của MockPatientRecordLocator (sử dụng constructor tiêm) và cho biết dụ của MockPatientRecordLocator nên được tiêm với một Ví dụ của IContactAdapter (một lần nữa sử dụng constructor injection (nếu có thể)). Phần đầu của chuỗi hoạt động, phần thứ hai thì không.
Hi Ruben, nhờ sự giúp đỡ của bạn (và lời khen). Đang cố gắng tốt nhất tôi có thể :-) Trong thiết lập đặc biệt này tôi đã không sử dụng các mô-đun, nhưng tôi sẽ chuyển sang sử dụng chúng để tôi có thể dễ dàng sử dụng Bind(). – norgie