2011-12-09 21 views
9

Dựa trên câu hỏi này: Should thoses kind of service go injected in a base class ? (versus static classes).Cách ràng buộc được thực hiện với trang trí bằng Ninject?

Cách liên kết sẽ được thực hiện với người trang trí bằng Ninject? hoặc bất kỳ DIContainer nào?

public class CachedLoggedRepository : IRepository 
{ 
    public IRepository repository { get; set; } 
    void Add(); 
} 

public class CachedRepository : IRepository 
{ 
    public IRepository repository { get; set; } 
    void Add(); 
} 

public class Repository : IRepository 
{ 
    void Add(); 
} 

Trả lời

15

Bạn phải sử dụng các ràng buộc có điều kiện ví dụ

Bind<IRepository>().To<Repository>().WhenInjectedInto<CachedRopsitory>(); 
Bind<IRepository>().To<CachedRepository>().WhenInjectedInto<CachedLoggedRepository>(); 
Bind<IRepository>().To<CachedLoggedRepository>(); 
+1

Cảm ơn cho câu trả lời tuyệt vời này. – Rushino

+2

+1 Và trong một số trường hợp (hiếm hơn), bạn có thể đang sử dụng 'TImpl' dựa trên chung, trong trường hợp này bạn' Bind >(). Để () 'như trên - trong trường hợp đó bạn sử dụng mệnh đề '.When' ... hơi khác một chút, [ràng buộc] (https://github.com/ninject/ninject/wiki/Contextual-Binding) dựa trên loại cơ sở chung của loại bê tông được tiêm vào. Một điều hữu ích khác cần lưu ý là nếu bạn tìm thấy bạn cần một chút gì đó khác với những gì cần thiết, bạn sẽ có được nguồn Ninject và tìm trong tệp/phân tích tĩnh qua nó để tìm các ví dụ - ví dụ: nhìn vào 'WhenInjectedInto' –

+0

Làm thế nào điều này có thể được thực hiện khi bạn muốn cấu hình nhiều phụ thuộc theo quy ước? – Rookian

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