示例代码:
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?
答案 0 :(得分:0)
这适用于SM v2.6.3(返回类2)。在SM v3.1.1上,它没有按预期工作(返回类1)。看起来这是一个bug,可能是在3.0版本的那个区域进行重构时产生的。查看调用之前和之后的容器元数据注册:
container.EjectAllInstancesOf<IMyClass>();
注册被清除,但不知何故旧实例已解决。可能是单身人士的缓存问题。无论它是否是命名实例,它都是相同的情况。
关于EjectAllInstancesOf
,IMyClass在实例中注册,因此容器将其视为单例,因此使用此方法是有意义的。
刚刚通过代码调试了v3.1.4的源代码,它正在按预期工作,所以我建议你从nuget获取最新版本,这应该可行。