我已经注入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
?
答案 0 :(得分:0)
我认为这是正确的:
当我实例化new Container( e=> ... )
时,我会获得默认注册表。
然后我添加了两个注册表,如果是默认注册表,则会覆盖任何配置。
然后我在默认注册表中更改了某些内容,但在添加Registry2
时已经覆盖了此内容。