如何交换结构映射命名实例



示例代码:

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();
    }
}

我希望实例 2 返回类 2,但它返回类 1。示例代码有什么问题吗?我需要做什么才能获得 class2?

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

container.EjectAllInstancesOf<IMyClass>();

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

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

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

最新更新