Invest in people before investing in tools

Il blog di Matteo Baglini
posts - 118, comments - 95, trackbacks - 697

[Spring.NET #13] Spring.Core, IoC e DI (Constructor Injection)

Grazie alle funzionalità di Constructor Argument Resolution viste nei post precedenti Spring.NET implementa l' IoC di tipo 3 (Constructor Injection).  Iniziamo estendendo la classe per tradurre frasi dall'inglese all'italiano in modo che supporti altri linguaggi, per fare questo applichiamo il Design Pattern Strategy. Creiamo l'interfaccia ITranslator la quale rappresenta il contratto:

   1: public interface ITranslator
   2: {
   3:     string Translate(string phraseToTranslate);
   4: }

procediamo implementando le classi che si occuperanno realmente di tradurre la frase, ne facciamo una dall'inglese all'italiano:

   1: public class EnglishToItalianTranslator : ITranslator
   2: {
   3:     public string Translate(string phraseToTranslate)
   4:     {
   5:         string phraseTranslated;
   6:  
   7:         //qui va l'algoritmo di traduzione...
   8:         if (phraseToTranslate == "Hello Spring.NET !!")
   9:         {
  10:             phraseTranslated = "Ciao Spring.NET !!";
  11:         }
  12:         else
  13:         {
  14:             phraseTranslated = "Frase sconosciuta.";
  15:         }
  16:  
  17:         return phraseTranslated;
  18:     }
  19: }

e una dallo spagnolo all'italiano:

   1: public class SpanishToItalianTranslator : ITranslator
   2: {
   3:     public string Translate(string phraseToTranslate)
   4:     {
   5:         string phraseTranslated;
   6:  
   7:         //qui va l'algoritmo di traduzione...
   8:         if (phraseToTranslate == "Hola Spring.NET !!")
   9:         {
  10:             phraseTranslated = "Ciao Spring.NET !!";
  11:         }
  12:         else
  13:         {
  14:             phraseTranslated = "Frase sconosciuta.";
  15:         }
  16:  
  17:         return phraseTranslated;
  18:     }
  19: }

 adesso non rimane che creare la classe context che accetta in ingresso il contratto:

   1: public class PhraseTranslator
   2: {
   3:     private ITranslator _concreteTranslator = null;
   4:  
   5:     public PhraseTranslator(ITranslator concreteTranslator)
   6:     {
   7:         _concreteTranslator = concreteTranslator;
   8:     }
   9:  
  10:     public string Translate(string phraseToTranslate)
  11:     {
  12:         return _concreteTranslator.Translate(phraseToTranslate);
  13:     }
  14: }

Configuriamo gli oggetti e indichiamo quale implementazione prende in ingresso la classe PhraseTranslator tramite l'attributo ref del tag constructor-arg:

<object id="EngTranslator" 
        type="SpringSeries.Core.ConstructorInjection.EnglishToItalianTranslator, 11.ConstructorInjection"/>
<object id="SpaTranslator" 
        type="SpringSeries.Core.ConstructorInjection.SpanishToItalianTranslator, 11.ConstructorInjection"/>

<object id="Translator" 
        type="SpringSeries.Core.ConstructorInjection.PhraseTranslator, 11.ConstructorInjection">
  <constructor-arg name="concreteTranslator" ref="EngTranslator" />
</object>

In fine nel nostro codice basterà richiedere l'oggetto Translator e Spring.NET si occupera di istanziare e inittare le propie dipendenze:

   1: IApplicationContext _ctx = ContextRegistry.GetContext();
   2: PhraseTranslator _translator = (PhraseTranslator)_ctx.GetObject("Translator");
   3: Console.WriteLine(_translator.Translate("Hello Spring.NET !!"));
   4: Console.WriteLine(_translator.Translate("Hola Spring.NET !!"));

per utilizzare il traduttore spagnolo basterà modificare il file Xml e riavviare l'applicazione:

<object id="EngTranslator" 
        type="SpringSeries.Core.ConstructorInjection.EnglishToItalianTranslator, 11.ConstructorInjection"/>
<object id="SpaTranslator" 
        type="SpringSeries.Core.ConstructorInjection.SpanishToItalianTranslator, 11.ConstructorInjection"/>

<object id="Translator" 
        type="SpringSeries.Core.ConstructorInjection.PhraseTranslator, 11.ConstructorInjection">
  <constructor-arg name="concreteTranslator" ref="SpaTranslator" />
</object>
Technorati Tags:

Print | posted on giovedì 27 settembre 2007 00:18 | Filed Under [ .NET OpenSource Spring.NET ]

Powered by:
Powered By Subtext Powered By ASP.NET