[英]Autofac Named Registration Failing
我正在嘗試使用命名注冊和func來注冊所需的實現。
builder
.RegisterType<AImpl>().Named<IMyInterface>("all");
builder
.RegisterType<BImpl>().Named<IMyInterface>("all");
builder
.Register(c =>
{
var myImpl= c.ResolveNamed<IEnumerable<IMyInterface>>("all").FirstOrDefault(a => a.Code == "SOMESTRING");
if (myImpl== null)
throw new MySpecificException("SOMESTRING");
return myImpl;
})
.AsImplementedInterfaces();
當我嘗試解決時,出現以下異常:
var myImpl = c.Resolve<IMyInterface>();
Autofac.dll中發生類型為'Autofac.Core.Registration.ComponentNotRegisteredException'的異常,但未在用戶代碼中處理
附加信息:所請求的服務“ MyNameSpace.IMyInterface”尚未注冊。 為避免此異常,請注冊一個組件以提供服務,使用IsRegistered()檢查服務注冊,或使用ResolveOptional()方法解決可選的依賴項。
有人知道為什么這會失敗嗎? 內部函數解析可以正常運行,因此不是!
謝謝尼爾
也許我不明白這個問題,但我認為您做錯了。 應該使用RegisterNamed以便通過字符串標簽獲得實現。
在您的示例中,您具有:
builder.RegisterType<AImpl>().Named<IMyInterface>("all");
builder.RegisterType<BImpl>().Named<IMyInterface>("all");
這對我來說沒有意義。 您應該致電:
builder.RegisterType<AImpl>().Named<IMyInterface>("TheNameIsA");
builder.RegisterType<BImpl>().Named<IMyInterface>("TheNameIsB");
並且,在使用類中,您可以在構造函數中要求:
public MyComponent(IIndex<string, IMyInterface> myInterfaceIndex)
...
並從中要求您要的組件為:
var a = myInterfaceIndex["TheNameIsA"];
var b = myInterfaceIndex["TheNameIsB"];
或者,您可以要求(通過構造函數或屬性注入)ILifetimeScope並將其用於動態解析,如下所示:
var a = myLifetimeScope.ResolveNamed<IMyInterface>("TheNameIsA");
請注意,與問題無關:很明顯,如果您確實需要同時提供多個實現,那么這是很容易的。 如果僅需要這兩種實現之一,則應使用一個模塊並對其進行配置,以便它僅注冊這兩種實現之一。
編輯:您正在得到的異常是(應該是),因為您沒有調用ResolveNamed。 您要的是IMyInterface,但您沒有注冊沒有名稱的IMyInterface。 所以你得到了例外。 我不是100%自信,但是我敢說我對此很有信心。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.