Sur MSDN Solution Development Fundamentals:
Ses domaines fonctionnels sont :
Dependencies Injection (DI)
The Unity Application Block (Unity) is a lightweight, extensible dependency injection container that supports constructor injection, property injection, and method call injection. You can use it with Enterprise Library to generate both Enterprise Library objects and your own custom business objects. However, the Unity Application Block differs from the other application blocks included in Enterprise Library in several fundamental ways:
Exemple d'injection de dépendance. Ici on injecte un “IVehicule” dans un “Coursier” (le pauvre ).
<unity> <containers> <container> <types> <type type="UnityTest01.IVehicule, UnityTest01" mapTo="UnityTest01.Moto, UnityTest01" name="uneMoto" /> <type type="UnityTest01.IVehicule, UnityTest01" mapTo="UnityTest01.Voiture, UnityTest01" name="uneVoiture" /> <type type="UnityTest01.Coursier, UnityTest01" mapTo="UnityTest01.Coursier, UnityTest01" name="Marcel"> <typeConfig > <property name="Vehicule" propertyType="UnityTest01.IVehicule, UnityTest01"> <dependency name="uneVoiture" /> </property> </typeConfig> </type> <type type="UnityTest01.Coursier,UnityTest01" mapTo="UnityTest01.Coursier, UnityTest01" name="Antoine"> <typeConfig > <property name="Vehicule" propertyType="UnityTest01.IVehicule,UnityTest01"> <dependency name="uneMoto" /> </property> </typeConfig> </type> </types> <instances> <!-- Je ne comprends pas que ce ne soit pas dans "instances" mais dans "types" que l'on créé les instances des objets. <add name="uneMoto" type="UnityTest01.Moto" value=""/> <add name="uneVoiture" type="UnityTest01.Voiture" value=""/> <add name="unCoursier" type="UnityTest01.Coursier" value=""> <property name="Vehicule" propertyType="UnityTest01.IVehicule"> <value value="uneVoiture" /> </property> </add> --> </instances> </container> </containers> </unity>
UnityContainer container = new UnityContainer(); UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity"); section.Containers.Default.Configure(container); Coursier coursierMarcel = container.Resolve<Coursier>("Marcel") as Coursier; Debug.WriteLine("coursierMarcel.Vehicule.WheelsCount: " + coursierMarcel.Vehicule.WheelsCount); this.textBox1.AppendText(String.Format("Marcel est équipé d'un véhicule à {0} roues.", coursierMarcel.Vehicule.WheelsCount) + Environment.NewLine); Coursier coursierAntoine = container.Resolve<Coursier>("Antoine") as Coursier; Debug.WriteLine("coursierAntoine.Vehicule.WheelsCount: " + coursierAntoine.Vehicule.WheelsCount); this.textBox1.AppendText(String.Format("Antoine est équipé d'un véhicule à {0} roues.", coursierAntoine.Vehicule.WheelsCount) + Environment.NewLine);
En fait je me demande pourquoi les objets sont déclarés dans la section “types” et pas dans la section “instances” ?? Du coup je trouve le schéma de Unity bien plus compliqué que celui de Spring.NetJe suppose que Type c'est pour enregistrer mapper un type à un autre (mapper par exemple un IToto à un Toto). Quand tu fais un container.Resolve<IToto> il te renvoie un objet de type Toto.
Instance ça doit être pour mapper un type à une instance précise. Quand tu lui demande le type A il te renvoie l'instance que tu as enregistrés, et pas une nouvelle.
Extrait de la doc :
La partie DAAB de EntLib remplace dynamiquement SQLConnexion par OracleConnexion, ainsi que les commandes, transactions etc. Il remplace aussi la chaîne de connexions, il permet aussi le chiffrage des chaînes de connexion, etc.