AddAllTypesOf vs ConnectImplementationsToTypesClosing

CSh*_*per 16 c# structuremap asp.net-mvc dependency-injection inversion-of-control

我很好奇这两种方法之间的区别.我正在使用开放式泛型实现装饰器模式,无论我使用它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();
        }
    } 
Run Code Online (Sandbox Code Playgroud)

ObjectFactory.WhatDoIHave()无论我选择哪种方法,调用也会给出相同的结果.

我查看了源代码,这些方法肯定做了不同的事情,我只是无法确切地确定区别是什么.当一个人优先于另一个时,是否有任何指导方针或情景?

nat*_*ere 4

警告:我已经好几年没有在商业项目中使用 StructureMap 了。从那时起,事情可能已经发生了变化,但您的示例代码看起来完全熟悉,所以我猜它没有太大变化。

我知道您想要选择其中一种而不是另一种的唯一原因是当您想要显式定义将用于将具体实现映射到T. 两者都可以做到,但实现的稳健性不同。

如果您使用ConnectImplementationsToTypesClosing<T>,则在Scan()设置过程中您将传入一个继承自 的约定类IRegistrationConvention。至少对我来说,它没有任何麻烦。

AddAllTypesOf<T>据说具有类似的功能,ITypeScanner但实际上我们遇到了各种奇怪的问题,例如重复的类型注册,如果位于不同的命名空间中则类型不会注册,T并且通常找不到它们应该的特定实现。使用后这些问题都迎刃而解了ConnectImplementationsToTypesClosing<T>

如果您不想做任何太聪明的事情并且默认约定适合您,那么您应该注意到两者之间没有区别。如果您出于任何原因需要覆盖默认约定,我强烈支持ConnectImplementationsToTypesClosing<T>