2017-07-28 49 views
-1

問題是相當基本的,我剛開始使用Autofac,遇到Autofac無法正常工作的問題,因爲我預計它可以正常工作。因此,鑑於「這是它的工作方式」,我想了解這種行爲背後的邏輯。 這是非常基本的代碼:Autofac和鍵控註冊 - 正確的行爲?

public interface X { } 

internal class A : X { } 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var builder = new ContainerBuilder(); 
     builder.RegisterType<A>().Keyed<X>("A"); 
     ILifetimeScope scope = builder.Build(); 

     try 
     { 
      var instance = scope.Resolve<X>(); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e); 
      throw; 
     } 
    } 
} 

解決會導致錯誤(異常)的嘗試。 但是爲什麼? 事實上,我並沒有要求解決具體鍵控,呼籲

var instance = scope.ResolveKeyed<X>("A"); 

將工作和解決象預期的那樣好,如果我註冊

builder.RegisterType<A>().Keyed<X>("A").As<X>(); 

但爲什麼不作爲,如果我沒有解決任何問具體鍵? 我的意思是我希望的邏輯 - 我要求具體 - 決心具體,如果我沒有要求具體 - 決心任何/最後註冊。

那麼爲什麼這種行爲被選爲默認值。

回答

1

註冊爲密鑰服務的服務只能使用該密鑰解析。如果您想在不使用密鑰的情況下解決服務問題,則必須使用.As<...>()註冊一個服務。如果您希望他們使用密鑰解析或默認解決方案,請將您的組件註冊到兩者。

要使用一個類比,你可以有一個門有兩種手柄:一個帶鎖,或一個沒有。如果你想打開鑰匙門,你需要提供鑰匙。沒有鎖的門顯然不需要鑰匙。

+0

是的,我明白,問題是「爲什麼」,這種方法背後的邏輯或意識形態。 – TheLordkiron

+0

因此,您可以擁有無​​法解密的密鑰服務,而且您也可以擁有無​​需密鑰即可解析的密鑰服務,由您決定如何配置它。根據定義,「鍵控」服務需要密鑰。 '作爲'(無鍵)服務不。就是這樣,因爲這就是API的設計。不管你想要什麼,你都可以設置你的服務。我們在這裏擁有密鑰服務,我們不*不希望在沒有密鑰的情況下解析。 – Amy

+0

你看我之所以問的原因是我有3個接口,用不同的密鑰註冊鍵和一個沒有密鑰註冊的場景,我希望在IIndex 中得到所有這些,然後我得到所有命名/鍵入字符串註冊,但我沒有得到註冊完成沒有名稱,使用類似(我索引 x),然後x [null]或x [string.Empty]導致錯誤(例外)。這裏的原因可能是微不足道的 - 理論上你可能有更多的非鍵控,所以IIndex無法解決你想要的,但這仍然不能解決我的問題:) – TheLordkiron