簡體   English   中英

如何注冊新列表 <IChecker> 到Autofac ContainerBuilder

[英]How to register a new List<IChecker> to Autofac ContainerBuilder

      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具有隱式集合支持 ,您可以注冊多個單獨的項目,當您解析這些項​​目的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會突然知道如何創建特定類型的列表。

如果你真的想要它,你可以添加一個自定義的Autofac RegistrationSource ,如果有人試圖解決IList Autofac將自動解決IEnumerable並創建一個列表......但這比你可能需要的多一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM