15

Мне любопытно относиться к различию между этими двумя методами. Я реализую шаблон декоратора с открытыми дженериками и использую ли я AddAllTypesOf или ConnectImplementationsToTypesClosing, это не имеет значения, я получаю ту же функциональность.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(); 
     } 
    } 

Вызов ObjectFactory.WhatDoIHave() также дает мне те же результаты, независимо от того, какой метод выбрать.

Я посмотрел исходный код, и эти методы определенно делают разные вещи, я просто не смог точно определить, в чем разница. Существуют ли какие-либо рекомендации или сценарии, когда вы предпочитаете друг друга?

ответ

3

Предостережение: Я не использовал StructureMap в коммерческом проекте уже несколько лет. С тех пор ситуация может измениться, но ваш примерный код выглядит полностью знакомым, поэтому я предполагаю, что он не сильно изменился.

Единственная причина, по которой я знаю, где вы хотите поддержать друг друга, - это когда вы хотите явно определить соглашения, которые будут использоваться для сопоставления конкретных реализаций с T. Оба могут это сделать, но надежность реализации отличается.

Если вы используете ConnectImplementationsToTypesClosing<T>, во время установки Scan() вы передаете класс конвенций, который наследуется от IRegistrationConvention. Для меня, по крайней мере, это просто работало без каких-либо неприятностей.

AddAllTypesOf<T> якобы имеет схожую функциональность через ITypeScanner но на практике у нас были всякие странные вопросы, с ним, как регистраций дублирующих типа, типа не зарегистрировавшись, если в другом пространстве имен из T, и часто не находят конкретных реализаций, которые они должны были к. Эти проблемы все исчезли при использовании ConnectImplementationsToTypesClosing<T>.

Если вы не пытаетесь сделать что-либо слишком умное, и для вас действуют соглашения по умолчанию, вы не заметите разницы между ними. Если вам нужно переопределить соглашения по умолчанию по какой-либо причине, я бы сильно поддержал ConnectImplementationsToTypesClosing<T>.

+0

Отличный ответ, это интересно, я попробую эти сценарии с более новыми версиями и посмотрю, что произойдет. – CSharper

Смежные вопросы