15

Sono curioso di sapere la differenza tra questi due metodi. Sto implementando un modello di decoratore con generici aperti e se io uso AddAllTypesOf o ConnectImplementationsToTypesClosing non importa, ottengo la stessa funzionalità.AddAllTypesOf vs ConnectImplementationsToTypesClosing

public class CommandRegistry : Registry 
    { 
     public CommandRegistry() 
     { 

      For<CommandProcessor>().Use<DefaultCommandProcessor>().Transient(); 

      Scan(scanner => 
      { 
       scanner.AssemblyContainingType<SaveCoolCommandHandler>();      

       //scanner.AddAllTypesOf(typeof(CommandHandler<>)); 
       //scanner.AddAllTypesOf(typeof(IValidator<>)); 
       //scanner.AddAllTypesOf(typeof(LogMehh<>)); 

       scanner.ConnectImplementationsToTypesClosing(typeof(CommandHandler<>)); 
       scanner.ConnectImplementationsToTypesClosing(typeof(IValidator<>)); 
       scanner.ConnectImplementationsToTypesClosing(typeof(LogMehh<>)); 
      }); 

      var handlerType = For(typeof(CommandHandler<>)); 

      handlerType.DecorateAllWith(typeof(CommandValidator<>)); //Second 
      handlerType.DecorateAllWith(typeof(CommandLogger<>)); //First 

      // ObjectFactory.WhatDoIHave(); 
     } 
    } 

La chiamata a ObjectFactory.WhatDoIHave() mi dà anche gli stessi risultati, non importa quale metodo scelgo.

Ho guardato il codice sorgente e questi metodi stanno sicuramente facendo cose diverse, non sono stato in grado di determinare esattamente quale sia la differenza. Ci sono delle linee guida o degli scenari quando si preferisce l'altro?

risposta

3

Avvertenza: non ho usato StructureMap in un progetto commerciale da diversi anni. Le cose potrebbero essere cambiate da allora, ma il tuo codice di esempio sembra completamente familiare quindi suppongo che non sia cambiato molto.

L'unico motivo per cui sono a conoscenza di dove preferire uno rispetto all'altro è quando si desidera definire in modo esplicito le convenzioni che verranno utilizzate per mappare le implementazioni concrete su T. Entrambi possono farlo, ma la robustezza dell'implementazione è diversa.

Se si utilizza ConnectImplementationsToTypesClosing<T>, durante l'installazione Scan() si passa in una classe di convenzione che eredita da IRegistrationConvention. Almeno per me ha funzionato senza problemi.

AddAllTypesOf<T> presumibilmente ha funzionalità simili attraverso ITypeScanner ma in pratica abbiamo avuto ogni tipo di problema strano con esso come il tipo registrazioni duplicati, tipi non di iscriversi se in uno spazio diverso da T, e spesso non trovando le implementazioni specifiche che avrebbero dovuto a. Questi problemi sono andati tutti via quando si utilizza ConnectImplementationsToTypesClosing<T>.

Se non stai provando a fare qualcosa di troppo intelligente e le convenzioni di default funzionano per te, non dovresti notare alcuna differenza tra i due. Se è necessario sovrascrivere le convenzioni di default per qualsiasi motivo, preferisco fortemente lo ConnectImplementationsToTypesClosing<T>.

+0

Ottima risposta, è interessante, proverò in questi scenari con le versioni più recenti e vedrò cosa succede. – CSharper

Problemi correlati