2012-02-03 3 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으로 다시 덮어 씁니다. 당신이 그들의 세 가지를 모두 등록 할 경우

당신은 기본 매핑 (이름없이 하나)를 포함하지 않는다 또한 ResolveAll에서

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

같은 이름 등록을 제공해야합니다. 명명 된 매핑으로 등록 된 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

감사합니다, 당신의 대답은 오늘 저에게 많은 디버깅을 오늘 저장했습니다! –