Tôi đặc biệt khuyên bạn không nên tạo một UnityContainer chuyên dụng/cục bộ/được tiêm cho từng loại như một trong các áp phích được đề xuất.
Điều này có thể được tiếp cận theo hai cách.
Một là xác định cụ thể việc giải quyết trong thời gian đăng ký là TylerOhlsen được đề xuất. Đây là một giải pháp tốt, tuy nhiên nếu bạn đăng ký sau cả ARepository và BRepository như triển khai cho IRepository, bạn vẫn cần phải đối phó với thực tế bạn có hai implenetations cho cùng một giao diện, và nếu một lớp thứ ba sẽ một ngày nào đó yêu cầu thực hiện IRepository, mà không xác định cụ thể trong đăng ký, nó sẽ nhận được một trường hợp không thể đoán trước.
Tùy chọn thứ hai, an toàn hơn một chút, đang đăng ký nhà máy cho IRepository. Ví dụ đơn giản nhất sẽ được sử dụng một chuỗi như chìa khóa, như thế này:
// Create a resolver(abstract factory) for the IRepository interface type
var resolver = myContainer.Resolve<Func<IRepository>>();
// ... other code here...
// Register mappings for the IRepository interface to appropriate concrete types
myContainer.RegisterType<IRepository, ARepository>("A");
myContainer.RegisterType<IRepository, BRepository>("B");
Sau đó, trong việc thực hiện FooController và BarController nhận nhà máy func bằng cách tiêm và chọn trường hợp đúng.
public class FooController
{
IRepository repository;
public FooController(IService service, Func<IRepository> repositoryFactory)
{
repository = repositoryFactory("A");
}
}
Bạn có thể đọc thêm về vấn đề này ở đây: http://msdn.microsoft.com/en-us/library/ff660854%28v=pandp.20%29.aspx
Câu hỏi dup trông khác nhau, nhưng câu trả lời là hoàn toàn giống nhau. – jgauffin
Đây là một câu trả lời khác hoạt động: http://stackoverflow.com/questions/4989676/injecting-a-specific-instance-of-an-interface-using-autofac – jgauffin