AddAllTypesOf vs ConnectImplementationsToTypesClosing

时间:2015-06-30 20:55:50

标签: c# asp.net-mvc dependency-injection inversion-of-control structuremap

我很好奇这两种方法之间的区别。我正在使用开放式泛型实现装饰器模式,无论我使用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 个答案:

答案 0 :(得分:4)

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

我知道你想要优先于另一个的唯一原因是你想要明确定义将用于将具体实现映射到T的约定。两者都可以做到,但实现的稳健性不同。

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

AddAllTypesOf<T>据称通过ITypeScanner具有类似的功能但实际上我们遇到了各种奇怪的问题,例如重复类型注册,如果在T的不同命名空间中,则不会注册类型,往往没有找到他们应该具体的实现。使用ConnectImplementationsToTypesClosing<T>时,这些问题都消失了。

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