2012-04-20 79 views
6
 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(); 

我有我应该怎么注册我的“,其中server =新列表{..}“的集装箱生成器有问题。我iChecker的列表作为参数传递到ServerChecker。这么多我就一直能解决,而不是名单本身,而是我必须有外,服务器的通常的名单要大得多。如何在新列表<IChecker>注册Autofac ContainerBuilder

回答

9

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>>(); 

这样,你还能避免做c.Resolve < ...>()调用在“ServerChecker”的解决方案中 - Autofac会突然知道如何创建特定类型的列表。

如果你真的想得到它,你可以add a custom Autofac RegistrationSource,如果任何人试图解决IList Autofac会自动做IEnumerable的决心,并创建一个列表......但这比你可能需要的多一点。

+0

我将ServerChecker更改为ServerChecker(IEnumerable Checker,IEnumerable Notifiers)。然后进行更改builder.RegisterInstance(new DiskSystem { ServerName = "SEFWG-FLEFSH" }).As(); builder.RegisterType(); 2012-04-26 08:31:54

+0

如果解决方案为您工作,请将此标记为答案。 :) – 2012-04-26 15:19:08