2012-02-03 11 views
22

Ho un codice che sembrano qualcosa di simile. Quando provavo a fare un ResolveAll mi aspettavo che ogni tipo registrato con lo IParserType cedesse dall'istanza del contenitore. Ma non ho ricevuto alcuna istanza da Unity. Sto assumendo o facendo qualcosa di sbagliato qui.non ResolveAll lavoro

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 
} 

risposta

46

Non sta registrando 3 diverse implementazioni di IParser. Si crea un mapping predefinito IParser ->SuperParser e quindi lo si sovrascrive con IParser ->DefaultParser e quindi lo si sovrascrive nuovamente con IParser ->BasicParser.

Se si desidera registrare tutti e tre di loro è necessario fornire le registrazioni di nome come

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

Inoltre ResolveAll non include la mappatura di default (quello senza un nome). Risolve solo le mappature di IParser registrate come associazioni con nome.

+1

Sai se il fatto che il valore predefinito non viene restituito è di progettazione o è un bug? –

+0

@NicolasIrisarri A parte il fatto che è nella base di codice almeno dalla v1.2, credo che sia di progettazione. Puoi facilmente aggirarlo se registri nuovamente il mapping predefinito con un nome (ad esempio "predefinito"). –

+1

questa è davvero una informazione preziosa. l'unità che si comporta in questo modo non ha alcun senso – vip32

11

È necessario registrare il parser con un nome, se si vuole risolvere tutte parser dal contenitore.

Here's il codice aggiornamento dal costruttore:

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

Nota:

v'è alcuna necessità per il seguente codice, causare i registri contenitore stesso durante la costruzione del contenitore.

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

Grazie, la tua risposta mi ha davvero salvato un sacco di debug oggi! –

Problemi correlati