簡體   English   中英

Autofac命名注冊失敗

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

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