StructureMap中的优先级 - 对于<t>或AddRegistry <t>?</t> </t>

时间:2014-08-27 16:39:43

标签: dependency-injection structuremap

我已经注入IFoo这种类型:

class MainThing
{
    public MainThing(IFoo foo)
    {
        Console.WriteLine(foo.Name);
    }
}

...和这个界面:

interface IFoo
{
    string Name { get; }
}

......以及IFoo的这两个实现:

class Foo1 : IFoo
{
    public string Name { get { return @"Foo1"; } }
}

class Foo2 : IFoo
{
    public string Name { get { return @"Foo2"; } }
}

......我已经注册了这个StructureMap:

        var c = new Container(e =>
        {
            e.AddRegistry<Registry1>();
            e.AddRegistry<Registry2>();
            e.For<IFoo>().Use<Foo1>();
        });

class Registry1 : Registry
{
    public Registry1() { For<IFoo>().Use<Foo1>(); }
}

class Registry2 : Registry
{
    public Registry2() { For<IFoo>().Use<Foo2>(); }
}

当我致电c.GetInstance<MainThing>();时,我希望MainThing获得Foo1个实例,但是它被赋予了Foo2个实例

文档说后续AddRegistry次调用会覆盖先前注册表中声明的默认实例。我之所以这么认为是因为我在最后附加了一个.Use<Foo1>,它在其之前就胜过其他一切,但事实并非如此。

此处WhatDoIHave()

===========================================================================================================
Configuration Sources:

0)   Registry:  StructureMap.ConfigurationExpression, StructureMap, Version=2.6.4.0, Culture=neutral, PublicKeyToken=e60ad81abae3c223
1)   Registry:  ConsoleApplication13.Registry1, ConsoleApplication13, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
2)   Registry:  ConsoleApplication13.Registry2, ConsoleApplication13, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
3)   Registry:  StructureMap.Configuration.DSL.Registry, StructureMap, Version=2.6.4.0, Culture=neutral, PublicKeyToken=e60ad81abae3c223


===============================================================================================================================================================================================================
PluginType                               Name                                     Description                                                                                                                  
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Func`1<TResult> (Func`1<TResult>)                                                                                                                                                                              
Scoped as:  Transient

                                         478e77e8-ff84-47e2-bdc1-b90bac2e7b61                                                                                                                                  
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
IFoo (ConsoleApplication13.IFoo)         f10f7750-f009-4842-ae35-7af47826ac2b     Configured Instance of ConsoleApplication13.Foo2, ConsoleApplication13, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
Scoped as:  Transient

                                         9bd57a90-9c1e-4674-b249-7e6e96b40945     Configured Instance of ConsoleApplication13.Foo1, ConsoleApplication13, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
                                         3e14df0c-da47-40e2-96ed-9bc6027a5da8     Configured Instance of ConsoleApplication13.Foo1, ConsoleApplication13, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
                                         f10f7750-f009-4842-ae35-7af47826ac2b     Configured Instance of ConsoleApplication13.Foo2, ConsoleApplication13, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
IContainer (StructureMap.IContainer)     cb17947d-5814-4c9b-a219-f359333d6fdb     Object:  StructureMap.Container                                                                                              
Scoped as:  Transient

                                         cb17947d-5814-4c9b-a219-f359333d6fdb     Object:  StructureMap.Container                                                                                              
===============================================================================================================================================================================================================
Foo2

我可以看到IFoo的3个实例,Foo2是默认设置,但我不知道为什么。

StructureMap是否优先AddRegistry优先于For

1 个答案:

答案 0 :(得分:0)

认为这是正确的:

当我实例化new Container( e=> ... )时,我会获得默认注册表。

然后我添加了两个注册表,如果是默认注册表,则会覆盖任何配置。

然后我在默认注册表中更改了某些内容,但在添加Registry2时已经覆盖了此内容。