Accueil > .NET > Castle Windsor Auto-wiring properties

Castle Windsor Auto-wiring properties

J’écrit cet article suite à la question que Loïc NICOLAS a posé sur Stackoverflow :

http://stackoverflow.com/questions/8436246/is-it-possible-to-configure-embbeded-dictionaries-using-c-net4-0-and-windsor-ca

En effet, Loic a relevé une question très intéressante et pertinente sur le moyen de configurer

Une propriété de service Windsor relativement complexe.

Tout d’abord je commence par répondre à la question de Loïc pour montrer que c’est parfaitement faisable, contrairement aux réponses négatives qu’il a reçu dans le thread.

En second lieu j’expliquerai en quoi cette méthode est une mauvaise pratique et son alternative.

La clé au problème du  snippet de code de Loïc réside en la façon avec laquelle sont configurés les « Generics », supposons que j’ai la classe Generic suivante :

Public class GenericClass<Type1, Type2>:where Type1…

{

//Do stuff here

}

Comment configurer un service windsor en xml pour cette class ?

–         Pour dire à Windsor que c’est un generic on utilise le `

–         2 pour dire que le generic est bidimensionnel

–         Pour passer les types (dans ce cas) [[namespace du Type1,Assembly Type2],[namespace du Type1,Assembly Type 2]]

Nous pouvons donc avoir un service qui ressemble à ça :

<component id= «myGenericService »     service= « System.Collections.Generic.Dictionary`2[[namespace du Type1,Assembly Type2],[namespace du Type1,Assembly Type 2]] >

<componen/>

Donc pour la question de Loïc voici une solution :

<MyComplexDictionaryProperty>

  <Dictionary keyType=="Namespace de MyEnum1, Assembly de MyEnum1" valueType=valueType="System.Collections.Generic.Dictionary`2[[namespace de MyEnum2,Assembly de MyEnum2],[system.Int32,mscorlib]]"

    <Entry key=”MyEnum1Value”>

      <Dictionary

        keyType="namespace de MyEnum2,Assembly de MyEnum2"

        valueType="System.Int32, mscorlib">

        <Entry key="MyEnum2Value1">1</Entry>

      </Dictionary>

    </Entry>

  </Dictionary>

</MyComplexDictionaryProperty>

Je passe à la deuxième partie de ma réponse:

Comme vous avez bien, remarqué cette solution à la question de Loic est l’une des plus simples, alors que le xml est assez conséquent, complexe, difficile à comprendre et très verbeux.

La configuration xml de Castle Windsor est sensible à la casse ce qui fait qu’utiliser  ce contenaire IoC pour découpler des composants Devient un parcours du combattant.

Dans le cas de MyComplexDictionaryProperty on voit bien que cette propriété est plutôt faite Avec un esprit de créer un type et l’initialiser ce qui est hors Scope de tout contenaire IoC.

Il est plus intéressant dans le cas de figure de cette property de créer un type wrapper pour cette collection complexe et de la gérer par un service.

Si Vous n’arrivez pas à comprendre la solution, vous pouvez revenir vers moi pour avoir une application sample.

Categories: .NET Tags:
  1. Pas encore de commentaire
  1. Pas encore de trackbacks