StructureMap Convention - Registy.AddType和Registry.For()之间的差异。使用()

时间:2014-08-16 12:52:16

标签: structuremap structuremap3

简短的问题。 registry.AddType(pluginType, type);registry.For(pluginType).Use(type);之间存在一些差异?

代码:

public class BasicConvention : ConfigurableRegistrationConvention
{
    public override void Process(Type type, Registry registry)
    {
            if (something)
                registry.For(pluginType).Use(type).Singleton();
        }
    }
}

public class BasicConvention : ConfigurableRegistrationConvention
{
    public override void Process(Type type, Registry registry)
    {
            if (something)
                registry.AddType(pluginType, type);
        }
    }
}

使用WhatDoIHave()我可以看到相同的内容:

使用AddType:

===============================================================================================================================================================================================================================================================================
PluginType                  Namespace                          Lifecycle     Description                                                                                                                                               Name                                    
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ISession                    Paf.Application.Session            Transient     Paf.Application.Session ('Paf.Application.Session, Paf.Modules.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null')                              Paf.Application.Session,... (Default)
===============================================================================================================================================================================================================================================================================

使用For()。使用():

===============================================================================================================================================================================================================================================================================
PluginType                  Namespace                          Lifecycle     Description                                                                                                                                               Name                                    
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ISession                    Paf.Application.Session            Singleton     Paf.Application.Session                                                                                                                                (Default)                               
===============================================================================================================================================================================================================================================================================

唯一的区别在于描述......

有人?

2 个答案:

答案 0 :(得分:0)

registry.AddType(pluginType, type)的调用基本上是将ForUse链接在一起的简写,如同registry.For(pluginType).Use(type)

调用registry.AddType(pluginType, type)会导致直接调用Registry.alter.set插件类型和指定的具体类型。

registry.For(pluginType).Use(type)ForUse联系在一起。对For的调用会返回一个新的GenericFamilyExpression(构造函数为接口类型调用Registry.alter.set),对Use的调用最终会调用Registry.alter.set来生成具体类型是插件系列的默认值。

查看Registry.csGenericFamilyExpression.cs的源代码以及StructureMap source中的其他类。

答案 1 :(得分:0)

接受的答案并不完全正确。他们不一样。令人惊讶的是,在答案的最后指出了这一点。 Use将为插件(类型)设置默认实例,而AddType则不会。因此,您将无法使用Structure Map作为AddType的服务定位器。您可以出现此错误No default Instance is registered and cannot be automatically determined for type <type>