0

示例代码:

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?

4

1 回答 1

0

这适用于 SM v2.6.3(返回类 2)。在 SM v3.1.1 上,它没有按预期工作(返回类 1)。看起来这是一个错误,可能是在为 3.0 版重构该区域时引入的。查看调用前后的容器元数据注册:

container.EjectAllInstancesOf<IMyClass>();

注册被清除,但以某种方式解决了旧实例。单例的缓存问题可能。无论是否命名为实例,情况都是一样的。

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

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

于 2015-04-20T14:29:10.130 回答