Đối versons hiện tại của Autofac: (2.0+, vì vậy bất cứ điều gì bạn nên sử dụng ngày nay)
Bạn đăng ký nhiều ILoggers
(ví dụ):
var builder = new ContainerBuilder();
builder.Register<ConsoleLogger>()
.As<ILogger>();
builder.Register<EmailLogger>()
.As<ILogger>()
.PreserveExistingDefaults(); //keeps console logger as the default
Sau đó, nhận được tất cả ILogger
s:
var loggers = container.Resolve<IEnumerable<ILogger>>();
Bạn không cần phải làm gì đặc biệt, chỉ cần yêu cầu IEnumerable<T>
của loại mong muốn. Autofac có bộ sưu tập hỗ trợ ra khỏi hộp, cùng với adapters khác có thể bọc các thành phần của bạn với chức năng bổ sung. .
này là việc sử dụng giống như ImplicitCollectionSupportModule trước 2.x, nhưng nướng ngay trong
Đối với phiên bản cũ (0.X - 1,4)
Hai cách:
1) Sử dụng đăng ký bộ sưu tập
var builder = new ContainerBuilder();
builder.RegisterCollection<ILogger>()
.As<IEnumerable<ILogger>>();
builder.Register<ConsoleLogger>()
.As<ILogger>()
.MemberOf<IEnumerable<ILogger>>();
builder.Register<EmailLogger>()
.As<ILogger>()
.MemberOf<IEnumerable<ILogger>>();
Sau đó:
var loggers = container.Resolve<IEnumerable<ILogger>>();
cung cấp cho bạn IEnumerable.
hoặc 2) Bạn có thể sử dụng các mô-đun ImplicitCollectionSupport, mà sẽ làm cho công việc mã như các phiên bản mới hơn của Autofac:
builder.RegisterModule(new ImplicitCollectionSupportModule());
builder.Register(component1).As<ILogger>;
builder.Register(component2).As<ILogger>;
Sau đó giải quyết một tập hợp các ILogger chứ không phải tìm kiếm để giải quyết tất cả.
var loggers = container.Resolve<IEnumerable<ILogger>>();
cung cấp cho bạn IEnumerable, một lần nữa.
Bất kỳ lý do nào mà bạn muốn chia sẻ, vì lý do bạn chuyển từ Windsor sang Autofac? –
Điều mà tôi thực sự thích với Autofac là có thể thể hiện cấu trúc thành phần động thông qua các biểu thức lamda.Bằng cách sử dụng các biểu thức như trái ngược với autowiring có ít chỗ cho sự hiểu lầm về những gì các container là "làm" khi nó giải quyết một loại (lưu ý: autofac hỗ trợ autowiring nếu bạn thích). Cuối cùng, API Windsor đã trở nên quá lớn để phục vụ cho mọi khả năng nó mang lại ấn tượng về sự phức tạp, khi IOC là một khái niệm thực sự khá đơn giản. Không nói rằng tôi sẽ không bao giờ sử dụng Windsor nữa, chỉ cần thử các tùy chọn khác. – crowleym
Tôi đã xem xét chuyển từ Windsor sang Autofac. API của Windsor rất khó hiểu. – Amy