加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何向Autofac ContainerBuilder注册新列表

发布时间:2020-12-15 08:36:44 所属栏目:百科 来源:网络整理
导读:var servers = new ListIChecker { //Server1 new DatabaseSystem { ServerName = "ANTIVIRUS" },new DatabaseSizes { ServerName = "ANTIVIRUS"},new DiskBackup { ServerName = "ANTIVIRUS"},new SqlServerEventLog { ServerName="ANTIVIRUS"},new DiskSys
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();

我有一个问题,我应该如何向Container Builder注册我的“where server = new List {..}”.我的iChecker列表作为参数传递给ServerChecker.我已经能够解决了很多,但不是列表本身,但我必须在外面.通常的服务器列表要大得多.

解决方法

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< ...>()调用 – Autofac会突然知道如何创建特定类型的列表.

如果你真的想要它,你可以add a custom Autofac RegistrationSource,如果有人试图解决IList Autofac将自动执行IEnumerable的解析并创建一个列表……但这比你可能需要的多一点.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读