Tôi đoán không có cách nào để làm một cái gì đó như sau với Autofac, để ctor tiêm một bộ sưu tập đầy đủ các loại generic mở? Các loại Xử lý khác nhau có các phụ thuộc, nếu không tôi sẽ tự động xây dựng những thứ đó.autofac Giải quyết tất cả các loại kiểu generic mở?
class EventOne : IEvent {...}
class EventTwo : IEvent {...}
class EventThree : IEvent {...}
interface IHandleEvent<T> where T : IEvent {...}
class HandleEventOne : IHandleEvent<EventOne> {...}
class HandleEventTwo : IHandleEvent<EventTwo> {...}
class HandleEventThree : IHandleEvent<EventThree> {...}
builder.RegisterAssemblyTypes(myAssembies).AsClosedTypesOf(typeof(IHandleEvent<>));
builder.RegisterType<AService>().As<IAService>();
class AService : IAService
{
public AService(IEnumerable<IHandleEvent<IEvent>> handles)
{...}
}
'IEnumerable> 'sẽ cần phải được giải quyết chính xác 1 loại bê tông . Nếu bạn có một loại có thể tự động xây dựng chính nó (xem mẫu Builder), bạn có thể xác định và đăng ký nó với AutoFac như đăng ký cho 'IEnumerable > '. Bạn cũng có thể tiêm container DI trong loại đó nếu bạn cần lấy thông tin bổ sung để xây dựng nó. Tóm lại, tôi nghĩ bạn cần một người xây dựng hoặc mẫu nhà máy ở đây để giải quyết cá thể 'IEnumerable >' của bạn. –
Igor
Cảm ơn. Tôi đã xem xét các nhà máy ủy quyền autofac doc. Có vẻ như trong trường hợp này, thùng chứa sẽ được tiêm vào nhà máy để giải quyết các loại IHandleEvent khác nhau <>. – Suedeuno
Hãy thử chaning 'IHandleEvent 'của bạn' IHandleEvent '. Autofac có một số hỗ trợ cho phương sai và có thể tự động đăng ký khi bạn làm điều đó. Nhưng tôi luôn luôn quên liệu Autofac có hỗ trợ hiệp phương sai hay contravariance, vì vậy bạn sẽ phải thử nó. –
Steven