Как поменять именованный экземпляр 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>();

регистрации очищаются, но как-то разрешается старый экземпляр. Вопрос кеширования для синглетонов наверное. Это один и тот же случай, независимо от того, назван ли он экземпляром или нет.

относительно EjectAllInstancesOfIMyClass регистрируется с экземплярами, поэтому контейнер воспринимается как синглтон, поэтому имеет смысл использовать этот метод.

Просто отладил код с исходниками для v3.1.4, и он работает как положено, поэтому я советую вам получить последнюю версию из nuget, и это должно работать.

Другие вопросы по тегам