Подтвердить что ты не робот

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

У нас есть сценарий, в котором пользователь может выбирать между различными аппаратными средствами во время выполнения. В фоновом режиме мы имеем несколько различных классов оборудования, которые реализуют интерфейс 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());

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

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

4b9b3361

Ответ 1

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

Итак, если вы вызываете

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

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