C# Structuremap,使用默认实例和命名实例选项时的奇怪行为

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 {

有人能解释以下行为吗

特别是为什么TestInitializeAndConfigure_失败,而TestUse和Add没有失败。。。以及为什么TestUseOrderChanged失败而TestUseOrderChanged没有失败

谢谢

代码

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注释



这只回答了他最初问题的一部分。对我来说,真正的问题是测试初始化和配置失败(我也遇到了问题)。我想这是一只虫子。