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 ответ:
Метод RegisterInstance объекта UnityContainer всегда переопределяет последнюю запись регистрации, если вы не различаете их по имени.
Так что если вы позвоните
container.RegisterInstance<IHardware>(new HardwareB());
Вы переопределите регистрацию для интерфейса IHardware и восстановите HardwareB при следующей попытке разрешения