Как поменять именованный экземпляр StructureMap?
Образец кода:
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 ответ
Это работает на SM v2.6.3 (возвращает класс 2). На SM v3.1.1 он не работает должным образом (возвращает класс 1). Похоже, что это ошибка, вероятно, возникшая при рефакторинге в этой области для версии 3.0. Рассмотрим регистрацию метаданных контейнера до и после вызова:
container.EjectAllInstancesOf<IMyClass>();
регистрации очищаются, но как-то разрешается старый экземпляр. Вопрос кеширования для синглетонов наверное. Это один и тот же случай, независимо от того, назван ли он экземпляром или нет.
относительно EjectAllInstancesOf
IMyClass регистрируется с экземплярами, поэтому контейнер воспринимается как синглтон, поэтому имеет смысл использовать этот метод.
Просто отладил код с исходниками для v3.1.4, и он работает как положено, поэтому я советую вам получить последнюю версию из nuget, и это должно работать.