Có rất nhiều cách để đạt được kết quả mong muốn (bằng chứng là nhiều câu trả lời). Dưới đây là một cách sử dụng tên đăng ký (không có thuộc tính):
IUnityContainer container = new UnityContainer();
container.RegisterType<IQueue, MessageQueue>("ReceiveQueue",
new InjectionConstructor("receivePath"));
container.RegisterType<IQueue, MessageQueue>("SendQueue",
new InjectionConstructor("sendPath"));
container.RegisterType<Example>(
new InjectionConstructor(
new ResolvedParameter<IQueue>("ReceiveQueue"),
new ResolvedParameter<IQueue>("SendQueue")));
Example example = container.Resolve<Example>();
Nhược điểm của phương pháp này là nếu các nhà xây dựng Ví dụ được thay đổi thì mã số đăng ký cũng phải được sửa đổi để phù hợp. Ngoài ra, lỗi sẽ là một lỗi thời gian chạy và không phải là một lỗi thời gian biên dịch thích hợp hơn.
Bạn có thể kết hợp trên với một InjectionFactory để gọi các nhà xây dựng bằng tay để cung cấp cho biên dịch kiểm tra thời gian:
IUnityContainer container = new UnityContainer();
container.RegisterType<IQueue, MessageQueue>("ReceiveQueue",
new InjectionConstructor("receivePath"));
container.RegisterType<IQueue, MessageQueue>("SendQueue",
new InjectionConstructor("sendPath"));
container.RegisterType<Example>(new InjectionFactory(c =>
new Example(c.Resolve<IQueue>("ReceiveQueue"),
c.Resolve<IQueue>("SendQueue"))));
Example example = container.Resolve<Example>();
Nếu bạn đang sử dụng một gốc thành phần sau đó việc sử dụng các dây ma thuật ("ReceiveQueue" và " SendQueue ") sẽ bị giới hạn ở một địa điểm đăng ký.
Nguồn
2013-08-27 17:02:44
Mặc dù điều này trả lời câu hỏi, nó không phải là một giải pháp rất tốt, bởi vì điều này clutters các ứng dụng với các thuộc tính và các cặp vợ chồng ứng dụng vào container Unity. Thay vào đó, tôi muốn sử dụng 'InjectionFactory'. – Steven
Tôi xin lỗi, nhưng ví dụ thứ hai (cập nhật) của bạn là một ý tưởng tồi, đó là lý do tại sao bạn nhận được yêu cầu của tôi. Bạn không nên quảng cáo tiêm vào các lớp học, đó là [thực hành xấu] (http://blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti-Pattern/). – Steven
@Steven bạn nói đúng, tôi lấy lại bản chỉnh sửa đó. bài viết được liên kết có một số điểm rất hợp lệ. –