2011-11-02 35 views
11

Tôi đang sử dụng Ninject 2.0 để xử lý DI trong một trong các ứng dụng của mình và tôi đã gặp phải một số thứ khiến tôi khó hiểu. Có tài liệu bằng không không giúp quá nhiều hoặc là trung thực.Tiêm nhiều tham số hàm tạo cùng loại với Ninject 2.0

Nói rằng tôi có một constructor với chữ ký -

ctor(IServiceFactory factory1, IServiceFactory factory2) 
{ 
    this.factory1 = factory1; 
    this.factory2 = factory2; 
} 

Mặc dù hai dịch vụ này thực hiện cùng một giao diện, họ đang triển khai khá khác nhau và được sử dụng vào những thời điểm khác nhau vì vậy tôi không muốn tiêm một IEnumerable<IServiceFactory> .

Câu hỏi của tôi là, khi tôi ràng buộc các trường hợp, làm thế nào để tôi nói cho Ninject biết cần tiêm gì cho mỗi trường hợp?

Xin cảm ơn trước.

Cập nhật

Vì lợi ích của bất kỳ ai muốn xem mã sẽ kết thúc sau khi đọc liên kết của Remo, ... Đây là tóm tắt. (Tôi chưa bao giờ nhận ra C# có thuộc tính tham số!)

//abstract factory 
public interface IServiceFactory 
{ 
    Service Create(); 
} 

//concrete factories 
public class Service1Factory : IServiceFactory 
{ 
    public IService Create() 
    { 
     return new Service1(); 
    } 
} 

public class Service2Factory : IServiceFactory 
{ 
    public IService Create() 
    { 
     return new Service2(); 
    } 
} 

//Binding Module (in composition root) 
public class ServiceFactoryModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IServiceFactory>() 
      .To<Service1Factory>() 
      .Named("Service1"); 

     Bind<IServiceFactory>() 
      .To<Service2Factory>() 
      .Named("Service2"); 
    } 
} 

//consumer of bindings 
public class Consumer(
    [Named("Service1")] service1Factory, 
    [Named("Service2")] service2Factory) 
{ 
} 

Trả lời

10

Trước hết bạn phải tự hỏi mình nếu sử dụng cùng một giao diện là đúng nếu việc triển khai cần phải làm một điều hoàn toàn khác nhau. Thông thường, giao diện là hợp đồng giữa người tiêu dùng và triển khai. Vì vậy, nếu người tiêu dùng mong đợi những điều khác nhau thì bạn có thể xem xét để xác định các giao diện khác nhau.

Nếu bạn quyết định ở lại với cùng một giao diện hơn là bạn phải sử dụng các ràng buộc có điều kiện. Xem tài liệu về cách này được thực hiện:

https://github.com/ninject/ninject/wiki/Contextual-Binding

https://github.com/ninject/ninject/wiki/Conventions-Based-Binding

+0

Cảm ơn Remo. Chúng thực sự khác nhau về việc triển khai một nhà máy trừu tượng tạo ra các tab trong giao diện người dùng để chúng làm điều tương tự, ... chỉ vì những lý do khác nhau. – Stimul8d

+1

Tôi nghĩ bạn không hiểu chính xác. Từ điểm của người tiêu dùng họ không giống nhau. Giao diện cần được xác định từ quan điểm của người tiêu dùng. Ví dụ. nếu bạn có một giao diện nhà máy 'Fruit CreateFruit()' và người tiêu dùng mong đợi hai triển khai một cho chuối và một cho cam thì bạn nên xác định giao diện là 'Banana CreateBanana()' và 'Orange CreateOrange()' ngay cả khi bạn cần chúng chỉ là trái cây. –

+0

Tôi hiểu. Bạn đang gợi ý rằng tôi sử dụng các phương pháp nhà máy chứ không phải là một nhà máy trừu tượng với các lớp nhà máy bê tông. Đó là một lựa chọn nhưng bản thân các nhà máy có các phụ thuộc (các màn hình phụ trong trường hợp này) cần phải được tiêm. Những phụ thuộc đó dễ dàng hơn nhiều để giải quyết với các nhà máy bê tông và việc xây dựng hệ thống phun hơn là các phương pháp nhà máy không phải là họ hay liệu Ninject có một số phép thuật khác mà tôi đang thiếu? – Stimul8d

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