AddAllTypesOf vs ConnectImplementationsToTypesClosing

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

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

Ответы

Ответ 1

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

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

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

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

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