2010-09-18 31 views
5

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.

Trả lời

1

Không tệ cho câu hỏi đầu tiên!

Bạn muốn sử dụng sự quá tải Bind(Type) để cho phép đăng ký những thứ mà bạn không có tĩnh có sẵn trong bối cảnh của mã Load() của bạn - làm những thứ bạn đang làm trong nhà cung cấp của bạn (ví dụ, giải quyết Type) lên phía trước . Điều này sẽ cho phép Ninject thực hiện việc khởi tạo đối tượng (mà không cần bất kỳ yêu cầu nào đối với một .ctor mặc định)

IIRC two or 3 of my most recent answers cũng chạm vào công cụ khám phá/tải này và có các ví dụ phù hợp với trường hợp của bạn.

(Và bạn sẽ không cần phải nghỉ mát để [Inject] thuộc tính khi bạn đã nhận được để loại bỏ mọi thứ)

+0

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

Các vấn đề liên quan