[英]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.