15

Ich bin neugierig auf den Unterschied zwischen diesen beiden Methoden. Ich implementiere ein Decorator-Muster mit offenen Generika und ob ich AddAllTypesOf oder ConnectImplementationsToTypesClosing es spielt keine Rolle, bekomme ich die gleiche Funktionalität. 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(); 
     } 
    } 

Der Aufruf von ObjectFactory.WhatDoIHave() gibt mir auch die gleichen Ergebnisse unabhängig davon, welche Methode ich wählen.

Ich habe den Quellcode angeschaut und diese Methoden machen definitiv verschiedene Dinge, ich konnte einfach nicht genau feststellen, was der Unterschied ist. Gibt es irgendwelche Richtlinien oder Szenarien, wenn man dem anderen vorgezogen wird?

Antwort

3

Vorbehalt: Ich habe StructureMap seit einigen Jahren in einem kommerziellen Projekt nicht mehr verwendet. Die Dinge haben sich seither verändert, aber Ihr Beispiel-Code scheint mir völlig vertraut zu sein, und ich vermute, dass sich daran nicht viel geändert hat.

Der einzige Grund, warum mir bewusst ist, wo Sie einen bevorzugen, ist, wenn Sie explizit die Konvention (en) definieren möchten, die für die Zuordnung von konkreten Implementierungen zu T verwendet werden. Beide können es, aber die Robustheit der Implementierung unterscheidet sich.

Wenn Sie ConnectImplementationsToTypesClosing<T> verwenden, geben Sie während der Installation Scan() eine Konventionsklasse ein, die von IRegistrationConvention erbt. Für mich hat es zumindest ohne Probleme geklappt.

AddAllTypesOf<T> hat angeblich eine ähnliche Funktionalität durch ITypeScanner aber in der Praxis hatten wir alle möglichen seltsamen Probleme mit ihm wie doppelte Typ Registrierungen, Typen nicht, wenn in einem anderen Namespace von T sich eintragen, und oft nicht die spezifischen Implementierungen zu finden, sie sollten zu. Diese Probleme gingen alle weg, wenn ConnectImplementationsToTypesClosing<T> verwendet wurde.

Wenn Sie nicht versuchen, etwas zu schlau zu machen und die Standardkonventionen für Sie arbeiten, sollten Sie keinen Unterschied zwischen den beiden bemerken. Wenn Sie die Standardkonventionen aus irgendeinem Grund überschreiben möchten, würde ich ConnectImplementationsToTypesClosing<T> stark bevorzugen.

+0

Große Antwort, das ist interessant, ich werde diese Szenarien mit neueren Versionen versuchen und sehen, was passiert. – CSharper