2012-02-03 51 views
22

我有一個代碼,看起來像這樣。當試圖執行ResolveAll時,我預計使用IParserType註冊的每種類型都從容器實例中刪除。但是我沒有從Unity得到任何實例。我在這裏假設或做錯了嗎?解決所有不工作

public class ResolveAllDemo 
{ 
    public ResolveAllDemo() 
    { 
     var container = new UnityContainer(); 

     container.RegisterInstance<IUnityContainer>(container); 
     container.RegisterType<IParser, SuperParser>(); 
     container.RegisterType<IParser, DefaultParser>(); 
     container.RegisterType<IParser, BasicParser>(); 
     // container.RegisterType<Crawler>(); 
     container.RegisterType<IParserFactory, UnityParserFactory>(); 

     foreach (var registeredMember in container.ResolveAll<IParser>()) 
     { 
      LoggingUtility.LogerInstance.Logger.Write(registeredMember); 
     } 
    } 

    #region Resolve Demo 

    public interface IParserFactory 
    { 
     IEnumerable<IParser> BuildParsers(); 
    } 

    public class UnityParserFactory : IParserFactory 
    { 
     private IUnityContainer _container; 

     public UnityParserFactory(IUnityContainer container) 
     { 
      _container = container; 
     } 

     public IEnumerable<IParser> BuildParsers() 
     { 
      return _container.ResolveAll<IParser>(); 
     } 
    } 

    public class DefaultParser : IParser 
    { 
     public override string ToString() 
     { 
      return "DefaultParser"; 
     } 
    } 

    public class BasicParser : IParser 
    { 
     public override string ToString() 
     { 
      return "BasicParser"; 
     } 
    } 

    public class SuperParser : IParser 
    { 
     public override string ToString() 
     { 
      return "SuperParser"; 
     } 
    } 

    public interface IParser 
    { 
    } 

    #endregion Resolve Demo 
} 

回答

46

您尚未註冊IParser的3種不同實現。您創建一個默認映射IParser - >SuperParser,然後用IParser - >DefaultParser覆蓋它,然後用IParser - >BasicParser再次覆蓋它。

如果你想他們三個都註冊,你必須提供一個名爲註冊像

container.RegisterType<IParser, SuperParser>("Super"); 
container.RegisterType<IParser, DefaultParser>("Default"); 
container.RegisterType<IParser, BasicParser>("Basic"); 

此外ResolveAll不包括默認映射(一個沒有名字)。它僅解決那些註冊爲命名映射的IParser的映射。

+1

您是否知道默認不返回的事實是設計還是錯誤? – 2015-03-12 14:00:26

+0

@NicolasIrisarri除了它至少在v1.2以來的代碼庫的事實,我相信這是設計。如果您再次使用名稱(例如「default」)註冊默認映射,則可以輕鬆解決該問題。 – 2015-03-12 15:43:23

+1

這確實是有價值的信息。這種方式的行爲沒有任何意義 – vip32 2016-12-13 16:15:59

11

如果要解析容器中的所有解析器,則需要使用名稱註冊解析器。

Here's從您的構造函數中的更新代碼:

public ResolveAllDemo() 
{ 

    var container = new UnityContainer(); 

    container.RegisterType<IParser, SuperParser>("SuperParser"); 
    container.RegisterType<IParser, DefaultParser>("DefaultParser"); 
    container.RegisterType<IParser, BasicParser>("BasicParser"); 

    container.RegisterType<IParserFactory, UnityParserFactory>(); 

    foreach (var registeredMember in container.ResolveAll<IParser>()) 
    { 
    LoggingUtility.LogerInstance.Logger.Write(registeredMember); 
    } 
} 

注:

沒有必要爲下面的代碼,構造容器時導致容器寄存器本身。

container.RegisterInstance<IUnityContainer>(container); 
// not needed cause UnityContainer registers itself on construction 
+0

謝謝,您的回答今天真的爲我節省了很多調試時間! – 2012-09-27 11:11:28

相關問題