2012-02-03 26 views
22

私はこのようなコードを持っています。 ResolveAllをしようとすると、私はIParserTypeで登録されたすべてのタイプがコンテナインスタンスから生成されると予想しました。しかし、私はUnityからインスタンスを取得しませんでした。私はここで何か間違ったことをやろうとしていますか?ResolveAll not working

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で再度上書きします。

あなたがそれらのすべての3つを登録したい場合は、さらにResolveAll

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

のような名前の登録を提供する必要がデフォルトのマッピング(名前なしの1)が含まれていません。名前付きマッピングとして登録されたIParserのマッピングのみを解決します。

+1

デフォルトが返されないということは設計上のものであるのか、それともバグですか? –

+0

@ NicolasIrisarri少なくともv1.2以降はコードベースにあるという事実を別にすれば、それは設計によるものだと私は信じています。デフォルトのマッピングを名前(たとえば「デフォルト」)で再度登録すると、簡単に回避できます。 –

+1

これは本当に貴重な情報です。この方法で動作する統一性は意味をなさない – vip32

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

ありがとう、あなたの答えは、今日私に多くのデバッグを今日保存しました! –