При регистрации и разрешении типов в контейнере 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");
Видишь, о чем я?
Спасибо
Кимбалл