Unity: замените зарегистрированный тип другим типом во время выполнения


У нас есть сценарий, в котором пользователь может выбирать между различными аппаратными средствами во время выполнения. В фоновом режиме у нас есть несколько различных классов оборудования, которые все реализуют интерфейс IHardware. Мы хотели бы использовать Unity для регистрации выбранного в данный момент аппаратного экземпляра для этого интерфейса. Однако, когда пользователь выбирает другое оборудование, это потребует от нас заменить эту регистрацию во время выполнения.

Следующий пример может сделать это более ясным:

public interface IHardware
{
    // some methods...
}

public class HardwareA : IHardware
{
    // ...
}

public class HardwareB : IHardware
{
    // ...
}


container.RegisterInstance<IHardware>(new HardwareA());

// user selects new hardware somewhere in the configuration...

// the following is invalid code, but can it be achieved another way?
container.ReplaceInstance<IHardware>(new HardwareB());

Может ли это поведения можно как-то добиться?

Кстати: я полностью осознаю, что экземпляры, которые уже были разрешены из контейнера, конечно, не будут заменены новыми экземплярами. Мы сами позаботимся об этом, заставив их разрешить этот случай еще раз.

1 26

1 ответ:

Метод RegisterInstance объекта UnityContainer всегда переопределяет последнюю запись регистрации, если вы не различаете их по имени.

Так что если вы позвоните

container.RegisterInstance<IHardware>(new HardwareB());

Вы переопределите регистрацию для интерфейса IHardware и восстановите HardwareB при следующей попытке разрешения