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)
{
}
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
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. –
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