Что соответствует «регистрационному имени» Unity в разделе конфигурации Unity? - PullRequest
1 голос
/ 30 июня 2009

При регистрации и разрешении типов в контейнере Unity с использованием кода вы можете использовать «Регистрационные имена» для устранения неоднозначности ваших ссылок, которые происходят из интерфейса или иерархии базовых классов.

Текст «регистрационного имени» будет предоставлен в качестве параметра для регистра и методов разрешения:

myContainer.RegisterType<IMyService, CustomerService>("Customers");

и

MyServiceBase result = myContainer.Resolve<MyServiceBase>("Customers");

Однако, когда я регистрирую типы в файлах конфигурации, я не вижу, где можно присвоить «регистрационное имя»

Я регистрирую интерфейс:

<typeAlias alias="IEnlistmentNotification" type="System.Transactions.IEnlistmentNotification, System.Transactions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />

Тогда два типа, которые я знаю, реализуют этот интерфейс:

<typeAlias alias="PlaylistManager" type="Sample.Dailies.Grid.Workers.PlaylistManager, Sample.Dailies.Grid.Workers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />

<typeAlias alias="FlexAleManager" type="Sample.Dailies.Grid.Workers.FlexAleManager, Sample.Dailies.Grid.Workers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />

Затем я предоставляю сопоставления между интерфейсом и двумя типами:

<type type="IEnlistmentNotification" mapTo="FlexAleManager"><lifetime type="singleton"/></type>

<type type="IEnlistmentNotification" mapTo="PlaylistManager"><lifetime type="singleton"/></type>

Кажется, что соответствует этому коду:

myContainer.RegisterType<IEnlistmentNotification, FlexAleManager>();
myContainer.RegisterType<IEnlistmentNotification, PlaylistManager>();

но ясно, что мне нужна запись о неоднозначности конфигурации, которая соответствует этому коду:

myContainer.RegisterType<IEnlistmentNotification, FlexAleManager>("Flex");
myContainer.RegisterType<IEnlistmentNotification, PlaylistManager>("Play");

Тогда, когда я войду в свой код, я смогу сделать это:

IEnlistmentNotification flex = myContainer.Resolve<IEnlistmentNotification>("Flex");
IEnlistmentNotification play = myContainer.Resolve<IEnlistmentNotification>("Play");

Видишь, о чем я?

Спасибо

Кимбалл

1 Ответ

1 голос
/ 30 июня 2009

, чтобы ответить на мой собственный вопрос, я нашел эту записку на сайте Codeplex / Unity:

<type type="IFoo" mapTo="ServerFoo" name="server" />
<type type="IFoo" mapTo="ClientFoo" name="client">
    <typeConfig extensionType="Microsoft.Practices.Unity.Configuration.TypeInjectionElement,Microsoft.Practices.Unity.Configuration">
      <constructor>
         <param name="server" parameterType="IFoo"> 
            <dependency name="server" />
         </param>
      </constructor>
     </typeConfig></type>

Обратите внимание, что у элемента type есть дополнительное поле: 'name', о котором я не знал. Это обеспечивает значение «регистрационное имя», которое я искал.

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

Итак ... Благодаря codeplex!

Кимбалл

...