Регистрация каскадных зависимостей - PullRequest
0 голосов
/ 22 февраля 2012
_container.RegisterType<TypeA>();
_container.RegisterType<TypeC>(); // TypeC has a dependency to TypeA
_container.RegisterType<TypeD>(); // TypeD has a dependency to TypeA

_container.RegisterType<TypeE>(); // TypeE has a dependencies to TypeC and TypeD
_container.RegisterType<TypeF>(); // TypeF has a dependencies to TypeC and TypeD

Как мне настроить это так, чтобы при создании типов E и F они оба использовали новый экземпляр TypeA (косвенно через типы C и D), но C и D оба использовали один и тот же TypeA?

Если это поможет представить, что TypeA - это хранилище, а C и D - службы, которые используют это хранилище. Типы E и F являются моделями представления, которые нуждаются в разных репозиториях, но взаимодействуют с репозиторием через сервисы C и D.

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

Ответы [ 3 ]

1 голос
/ 24 февраля 2012

Посмотрите на мой ответ на ваш второй вопрос здесь .

Используя PerResolveLifetimeManager, когда разрешено TypeE, TypeE и его зависимости TypeC и TypeD все получают один и тот же экземпляр TypeA.Когда TypeF разрешен, разрешается новый TypeA, которым он и все его зависимости будут делиться.

PerResolveLifetimeManager - одна из моих любимых вещей об Unity как контейнере IOC над другими.1016 *

0 голосов
/ 23 февраля 2012

Непросто. Вы должны попытаться назвать свой экземпляр и использовать InjectionConstructor для предоставления нужного вам экземпляра. Примерно так:

_container.RegisterType

_container.RegisterType ( новый InjectionConstructor (_container.Resolve ("MainRepository")));

0 голосов
/ 22 февраля 2012

Если вы зарегистрируете TypeA как синглтон, все экземпляры, запрашивающие объекты TypeA, будут использовать одну и ту же ссылку.При регистрации класса с помощью ContainerControlledLifetimeManager он будет сохранять объект как одиночный, пока контейнер не будет удален.

myContainer.RegisterType<IRepository, Repository>(new ContainerControlledLifetimeManager());

Это поведение по умолчанию.Чтобы изменить это, то есть каждый раз иметь новый экземпляр, в соответствии с MSDN здесь вам необходимо использовать другой жизненный цикл:

myContainer.RegisterType<IRepository, Repository>();
...