C# 如何注册新列表<;艾切克>;至Autofac ContainerBuilder var服务器=新列表{ //服务器1 新数据库系统{ServerName=“ANTIVIRUS”}, 新数据库大小{ServerName=“ANTIVIRUS”}, 新建DiskBackup{ServerName=“ANTIVIRUS”}, 新的SqlServerEventLog{ServerName=“ANTIVIRUS”}, 新DiskSystem{ServerName=“ANTIVIRUS”}, //服务器1 新数据库系统{ServerName=“SEJKG-S-DB01”}, 新数据库大小{ServerName=“SEJKG-S-DB01”}, 新磁盘备份{ServerName=“SEJKG-S-DB01”}, 新的SqlServerEventLog{ServerName=“SEJKG-S-DB01”}, 新的磁盘系统{ServerName=“SEJKG-S-DB01”}, }; var builder=new ContainerBuilder(); builder.RegisterInstance(通知程序).As(); RegisterInstance(servers.As(); 注册(c=>newserverchecker(c.Resolve(),c.Resolve()); 返回builder.Build();

C# 如何注册新列表<;艾切克>;至Autofac ContainerBuilder var服务器=新列表{ //服务器1 新数据库系统{ServerName=“ANTIVIRUS”}, 新数据库大小{ServerName=“ANTIVIRUS”}, 新建DiskBackup{ServerName=“ANTIVIRUS”}, 新的SqlServerEventLog{ServerName=“ANTIVIRUS”}, 新DiskSystem{ServerName=“ANTIVIRUS”}, //服务器1 新数据库系统{ServerName=“SEJKG-S-DB01”}, 新数据库大小{ServerName=“SEJKG-S-DB01”}, 新磁盘备份{ServerName=“SEJKG-S-DB01”}, 新的SqlServerEventLog{ServerName=“SEJKG-S-DB01”}, 新的磁盘系统{ServerName=“SEJKG-S-DB01”}, }; var builder=new ContainerBuilder(); builder.RegisterInstance(通知程序).As(); RegisterInstance(servers.As(); 注册(c=>newserverchecker(c.Resolve(),c.Resolve()); 返回builder.Build();,c#,autofac,C#,Autofac,我对如何注册我的“where server=new List{..}有问题'到容器生成器。我的iChecker列表作为参数传递给ServerChecker。我已经能够解决很多问题,但不是列表本身,而是必须解决外部问题。通常的服务器列表要大得多。Autofac具有,这样您可以注册多个单独的项目,并且当您解决一个IEnumerable的项目时e项目您将获得所有注册: var servers = new List<IChecker> { //Server1

我对如何注册我的“where server=new List{..}有问题'到容器生成器。我的iChecker列表作为参数传递给ServerChecker。我已经能够解决很多问题,但不是列表本身,而是必须解决外部问题。通常的服务器列表要大得多。

Autofac具有,这样您可以注册多个单独的项目,并且当您解决一个IEnumerable的项目时e项目您将获得所有注册:

      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();
var builder=newcontainerbuilder();
builder.RegisterType().As();
builder.RegisterType().As();
builder.RegisterType().As();
var container=builder.Build();
使用(var scope=container.BeginLifetimeScope())
{
var allDependencies=scope.Resolve();
//allDependencies将包含所有三种注册类型。
}
这将允许您大大简化注册,因为您不必提前实际构建列表-您可以直接注册每个“IChecker”或“INotifier”实例,并解析其中的IEnumerable

如果您能够将“ServerChecker”构造函数更改为采用IEnumerable而不是IList,那么您就完成了-您不需要再执行c.Resolve()操作。无论如何,这可能是一个更好的设计,因为IList意味着可以稍后修改集合,这可能不是您想要的。(可能是ServerChecker将IEnumerable的内容复制到自己的列表中,以便您可以修改本地副本,但您不希望人们认为他们可以或应该这样修改中心依赖项的内容。)

如果必须是IList,您可以添加另一个注册来动态创建列表:

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.
}
builder
.Register(c=>newlist(c.Resolve()))
.As();
这样,您仍然可以避免在“ServerChecker”的解析中调用c.Resolve()——Autofac将突然知道如何创建特定类型的列表


如果你真的想对它感兴趣,你可以这样做,如果有人试图解析IList Autofac,它会自动解析IEnumerable并创建一个列表……但这可能比你需要的多一点。

我将ServerChecker改为ServerChecker(IEnumerable Checker,IEnumerable Notifiers)。然后进行更改
builder.RegisterInstance(新DiskSystem{ServerName=“SEFWG-FLEFSH”})。As();builder.RegisterType();
如果解决方案适合您,请将此标记为答案。:)
builder
  .Register(c => new List<IDependency>(c.Resolve<IEnumerable<IDependency>>()))
  .As<IList<IDependency>>();