var servers = new List<IChecker> {
//Server1
new DatabaseSystem { ServerName = "ANTIVIRUS" },
new DatabaseSizes { ServerName = "ANTIVIRUS"},
new DiskBackup { ServerName = "ANTIVIRUS"},
new SqlServerEventLog { ServerName="ANTIVIRUS"},
new DiskSystem { ServerName="ANTIVIRUS"},
//Server1
new DatabaseSystem { ServerName="SEJKG-S-DB01" },
new DatabaseSizes { ServerName = "SEJKG-S-DB01"},
new DiskBackup { ServerName = "SEJKG-S-DB01"},
new SqlServerEventLog { ServerName="SEJKG-S-DB01"},
new DiskSystem { ServerName="SEJKG-S-DB01"},
};
var builder = new ContainerBuilder();
builder.RegisterInstance(notifiers).As<IList<INotifier>>();
builder.RegisterInstance(servers).As<IList<IChecker>>();
builder.Register(c => new ServerChecker(c.Resolve<IList<IChecker>>(), c.Resolve<IList<INotifier>>()));
return builder.Build();
我有一个问题,我应该如何将“where server = new List {..}”注册到Container Builder。我的iChecker列表作为参数传递给ServerChecker。我已经能够解决了很多问题,但不是列表本身,但我必须在外面。通常的服务器列表要大得多。
答案 0 :(得分:13)
Autofac有implicit collection support ,这样您就可以注册多个单独的项目,当您解决这些项目的IEnumerable时,您将获得所有注册:
var builder = new ContainerBuilder();
builder.RegisterType<FirstType>().As<IDependency>();
builder.RegisterType<SecondType>().As<IDependency>();
builder.RegisterType<ThirdType>().As<IDependency>();
var container = builder.Build();
using(var scope = container.BeginLifetimeScope())
{
var allDependencies = scope.Resolve<IEnumerable<IDependency>>();
// allDependencies will contain all three of the registered types.
}
这将允许您大大简化注册,因为您不必提前实际构建列表 - 您可以直接注册每个“IChecker”或“INotifier”实例并解析IEnumerable 他们。
如果你能够改变你的“ServerChecker”构造函数来获取IEnumerable而不是IList,那么你就完成了 - 你不再需要做c.Resolve()了。这可能是一个更好的设计,因为IList意味着集合可以在以后修改,这可能不是你想要的。 (可能是ServerChecker将IEnumerable的内容复制到自己的列表中,因此您可以修改本地副本,但您不希望人们认为他们可以或应该修改中央依赖项的内容。)
如果必须是IList,您可以添加另一个注册,即时创建列表:
builder
.Register(c => new List<IDependency>(c.Resolve<IEnumerable<IDependency>>()))
.As<IList<IDependency>>();
这样你仍然可以避免在“ServerChecker”的解析中执行c.Resolve&lt; ...&gt;()调用 - Autofac会突然知道如何创建特定类型的列表。
如果你真的想要它,你可以add a custom Autofac RegistrationSource,如果有人试图解决IList Autofac会自动解决IEnumerable并创建一个列表...但这只是一点点你可能需要。