Удаление уже зарегистрированных типов из UnityContainer во время выполнения? - PullRequest
4 голосов
/ 15 декабря 2008

Интересно, есть ли простой способ удалить уже зарегистрированные типы из контейнера единицы или хотя бы заменить существующие отображения интерфейса / типа на другой. Достаточно ли просто сопоставить другой тип класса с интерфейсом, а старый перезаписывается?


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

Ответы [ 4 ]

11 голосов
/ 25 марта 2011

В Unity 2, если вы пытаетесь заменить одну регистрацию на другую, вам необходимо указать как тип От, так и Кому в новой регистрации, если они были включены в исходную регистрацию.

Например, если у вас есть:


public interface IService
{
    void DoSomething();
}

public class SomeService : IService
{
    public void DoSomething();
}

public class AnotherService : IService
{
    public void DoSomething();
}

и вы регистрируете SomeService как:


container.RegisterType<IService, SomeService>();

тогда, если другая часть вашей системы хочет переопределить регистрацию IService для разрешения AnotherService, вам нужно зарегистрировать его как:

<code>
container.RegisterType<IService, AnotherService>();

Это кажется довольно простым, но я зациклился на нем, когда нужно было создать AnotherService на фабрике:


container.RegisterType<IService>(new InjectionFactory(x =>
{
    // this would be some complicated procedure
    return new AnotherService();
}));

В этом случае вы все равно получите SomeService. Чтобы получить другой сервис, который вы ожидаете, вам нужно указать тип TTo:


container.RegisterType<IService, AnotherService>(new InjectionFactory(x =>
{
    return new AnotherService();
}));
5 голосов
/ 08 января 2009

Прослушивание веб-трансляции (см. Поиск в msdn для поиска единства) заменяет зарегистрированные типы в сценарии с последним выигрышем. Поэтому, если вы используете config для загрузки своего контейнера, используйте код для регистрации того же типа, какой код выигрывает один (обратное также верно между прочим).

0 голосов
/ 15 декабря 2008

Вы всегда можете просто воссоздать контейнер и зарегистрировать новые типы. Скорее всего, это будет довольно дорого, если вам придется делать это снова и снова, и я думаю, что вам, возможно, придется пересмотреть свой дизайн фреймворка.

0 голосов
/ 15 декабря 2008

Я не проверил Unity, поэтому я могу ошибаться, но я думаю, что вы не можете сделать то, что вы пытаетесь сделать, так как с моей работой над нашей собственной функцией DI в нашей среде оказалось гораздо больше Эффективно сначала выполнить обнаружение типов, а затем запустить приложение, потому что вам не нужно блокировать хранилище типов для каждого доступа, чтобы увидеть, какие экземпляры внедрить в экземпляр, поскольку хранилище доступно только для чтения, оно никогда не мутирует.

...