2009-06-29 4 views
1

Lors de l'enregistrement et de la résolution de types dans un conteneur Unity à l'aide de code, vous pouvez utiliser les 'Noms d'enregistrement' pour désambiguïser vos références dérivées d'une interface ou d'une hiérarchie de classes de base.Qu'est-ce qui correspond au «nom d'enregistrement» de Unity dans la section de configuration de l'unité?

Le texte « nom d'enregistrement » serait fourni en tant que paramètre au registre et à la détermination des méthodes:

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

et

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

Cependant quand je vous inscrire types dans les fichiers de configuration Je ne ai pas voir où le 'nom d'enregistrement' peut être attribué

Je m'inscris une interface:

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

Ensuite, deux types que je connais mettre en œuvre cette interface:

<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" /> 

Je fournissent les correspondances entre l'interface et les deux types:

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

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

Cela semble correspondre à ce code :

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

mais clairement ce dont j'ai besoin est une entrée de configuration désambiguïsante t correspond à ce code:

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

Alors quand je rentre dans mon code que je pouvais faire ceci:

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

Voyez ce que je veux dire?

Merci,

Kimball

Répondre

1

pour répondre à ma propre question, je trouve ce morceau sur la maison Codeplex/Unité:

<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> 

Notez que l'élément de type a un champ supplémentaire: « nom que je ne connaissais pas. Cela fournit la valeur "nom d'enregistrement" que je recherchais.

L'élément param possède également un sous-élément nommé dependency avec un attribut name qui exécute la même fonction.

Alors ... Merci à codeplex!

+0

Kimball Utilisez le xsd la config pour éviter « disparus » sur des choses à l'avenir ;-): http://unitycontributions.codeplex.com/WorkItem/View.aspx?WorkItemId=2309 –

+0

S'il vous plaît , monsieur, tout échantillon (avec toutes les sources complètes et les tests) en utilisant IEnlistmentNotification "?? – Kiquenet

Questions connexes