C# Structuremap,使用默认实例和命名实例选项时的奇怪行为
有人能解释以下行为吗 特别是为什么TestInitializeAndConfigure_失败,而TestUse和Add没有失败。。。以及为什么TestUseOrderChanged失败而TestUseOrderChanged没有失败 谢谢 代码C# Structuremap,使用默认实例和命名实例选项时的奇怪行为,c#,structuremap,instances,named,C#,Structuremap,Instances,Named,有人能解释以下行为吗 特别是为什么TestInitializeAndConfigure_失败,而TestUse和Add没有失败。。。以及为什么TestUseOrderChanged失败而TestUseOrderChanged没有失败 谢谢 代码 interface IResource {} class TheFirstResource : IResource {} class TheSecondResource : IResource {} [TestFixture] class Test {
interface IResource {}
class TheFirstResource : IResource {}
class TheSecondResource : IResource {}
[TestFixture]
class Test
{
[Test]
public void TestUse_Fails()
{
ObjectFactory.Initialize(init =>
{
init.For<IResource>().Singleton().Use<TheFirstResource>();
init.For<IResource>().Singleton().Use<TheSecondResource>().Named("test");
});
IResource r1 = ObjectFactory.GetInstance<IResource>();
IResource r2 = ObjectFactory.GetNamedInstance<IResource>("test");
Console.WriteLine(string.Format("TestUse_Fails \n{0}\n{1}", r1, r2));
}
[Test]
public void TestUseOrderChanged()
{
ObjectFactory.Initialize(init =>
{
init.For<IResource>().Singleton().Use<TheSecondResource>().Named("test");
init.For<IResource>().Singleton().Use<TheFirstResource>();
});
IResource r1 = ObjectFactory.GetInstance<IResource>();
IResource r2 = ObjectFactory.GetNamedInstance<IResource>("test");
Console.WriteLine(string.Format("TestUseOrderChanged \n{0}\n{1}", r1, r2));
}
[Test]
public void TestUseAndAdd()
{
ObjectFactory.Initialize(init =>
{
init.For<IResource>().Singleton().Use<TheFirstResource>();
init.For<IResource>().Singleton().Add<TheSecondResource>().Named("test");
});
IResource r1 = ObjectFactory.GetInstance<IResource>();
IResource r2 = ObjectFactory.GetNamedInstance<IResource>("test");
Console.WriteLine(string.Format("TestUseAndAdd \n{0}\n{1}", r1, r2));
}
[Test]
public void TestInitializeAndConfigure_Fails()
{
ObjectFactory.Initialize(init =>
{
init.For<IResource>().Singleton().Use<TheFirstResource>();
});
ObjectFactory.Configure(init =>
{
init.For<IResource>().Singleton().Add<TheSecondResource>().Named("test");
});
IResource r1 = ObjectFactory.GetInstance<IResource>();
IResource r2 = ObjectFactory.GetNamedInstance<IResource>("test");
Console.WriteLine(string.Format("TestInitializeAndConfigure_Fails \n{0}\n{1}", r1, r2));
}
}
TestUse_Fails
Smtesting.TheSecondResource
Smtesting.TheSecondResource
TestUseOrderChanged
Smtesting.TheFirstResource
Smtesting.TheSecondResource
TestInitializeAndConfigure_Fails
Smtesting.TheSecondResource
Smtesting.TheSecondResource
TestUseAndAdd
Smtesting.TheFirstResource
Smtesting.TheSecondResource
TestUse_失败对我来说很有意义,因为调用Use()本质上意味着您正在为类型指定默认实例(并添加它)。最后一个通常会赢——我找不到关于这个的显式文档,但这是大多数容器的工作方式。r1调用获取第二个资源(最后一个设置为默认值),r2调用获取命名资源 TestUseOrderChanged之所以有效,是因为init/config之后的默认值是TheFirstResource,但第二个资源仍然以名称添加到容器中。因此r1获取FirstResource(与中的最后一个一样,因此是默认值),r2正确地获取第二个资源作为命名实例 TestInitializeAndConfigure_失败是个奇怪的问题。从我的位置,r1应该得到firstreSource,因为默认值没有被覆盖——Use()没有被再次调用。调用Initialize后调用Configure应该而不是根据文档重置容器。我会尝试调用ObjectFactory.WhatDoIHave()并查看在Initialize()和Configure()调用之后是否注册了FirstResource
对我来说,这看起来像个bug,我会考虑把它提交给SealthMeP用户组(http://groups.google.com/group/structuremap-users).
为了帮助那些偶然发现这一点的人,这里有一个来自杰米本人的答案。他在博客上回答了这个问题For().Use()具有破坏性。Do For()。使用()一次获取默认值,第二次调用For().Add()获取第二次注册。查看这两个API调用的Xml注释
这只回答了他最初问题的一部分。对我来说,真正的问题是测试初始化和配置失败(我也遇到了问题)。我想这是一只虫子。