如何交换StructureMap命名实例?

时间:2015-04-14 14:48:00

标签: c# ioc-container structuremap named-instance

示例代码:

public interface IMyClass
{
    string Name { get; set; }
}

public class MyClass : IMyClass
{
    public string Name { get; set; }
}

public static class Program
{
    public static void Main()
    {
        var container = new Container();

        var class1 = new MyClass() {Name = "class 1"};
        container.Configure(x => x.For<IMyClass>().Use(class1).Named("MyClass"));

        var instance1 = container.TryGetInstance<IMyClass>("MyClass");

        container.EjectAllInstancesOf<IMyClass>();

        var class2 = new MyClass() { Name = "class 2" };

        container.Configure(x => x.For<IMyClass>().Use(class2).Named("MyClass"));

        var instance2 = container.TryGetInstance<IMyClass>("MyClass");

        Console.ReadKey();
    }
}

我希望instance2返回class2,但是它会返回class1。示例代码有什么问题吗?我需要做些什么才能获得class2?

1 个答案:

答案 0 :(得分:0)

这适用于SM v2.6.3(返回类2)。在SM v3.1.1上,它没有按预期工作(返回类1)。看起来这是一个bug,可能是在3.0版本的那个区域进行重构时产生的。查看调用之前和之后的容器元数据注册:

container.EjectAllInstancesOf<IMyClass>();

注册被清除,但不知何故旧实例已解决。可能是单身人士的缓存问题。无论它是否是命名实例,它都是相同的情况。

关于EjectAllInstancesOf,IMyClass在实例中注册,因此容器将其视为单例,因此使用此方法是有意义的。

刚刚通过代码调试了v3.1.4的源代码,它正在按预期工作,所以我建议你从nuget获取最新版本,这应该可行。