2012-02-03 9 views
22

Böyle bir şeye benzeyen bir kodum var. ResolveAll yapmaya çalışırken, IParserType ile kaydedilen her tür kapsayıcı örneğinden elde edilmesini bekledim. Ancak Unity'dan herhangi bir örnek almadım. Burada yanlış bir şey mi yapıyorum?ResolveAll çalışmıyor

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 
} 

cevap

46

Sen IParser 3 farklı uygulamaları kaydetmeyiz. Bir varsayılan eşleme oluşturmayı IParser ->SuperParser ve daha sonra IParser ->DefaultParser ile üzerine yazıp IParser ->BasicParser ile tekrar yazabilirsiniz. Eğer üçünü kaydetmek istiyorsanız

varsayılan eşleme (isimsiz bir) içermez ek ResolveAll yılında

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

gibi adlandırılmış kayıtları sağlamak zorunda. Adlandırılmış eşleme olarak kaydedilen IParser eşleştirmelerini yalnızca çözümler.

+1

Varsayılanın iade edilmemesi gerçeğinin tasarımdan mı kaynaklandığı yoksa bir hata mı olduğunu biliyor musunuz? –

+0

@NicolasIrisarri Kodbase'de en az v1.2'den beri olduğu gerçeğinden ayrı olarak, tasarım gereği olduğuna inanıyorum. Varsayılan eşleştirmeyi tekrar bir adla (ör. "Varsayılan") kaydettiğinizde, kolayca çalışabilirsiniz. –

+1

bu gerçekten değerli bilgiler. bu şekilde davranan birlik hiç bir anlam ifade etmiyor – vip32

11

Tüm Parsers'ı kapsayıcıdan çözmek istiyorsanız, ayrıştırıcılarınızı bir adla kaydetmeniz gerekir.

Here's güncelleme yapıcınızdan kodu:

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); 
    } 
} 

Not: Aşağıdaki kodu için gerek yoktur

, kabın yapımı sırasında konteyner kayıtlarını kendisi neden olur.

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

Teşekkürler, cevabınız beni bugün çok fazla hata ayıklama kaydetti! –