Invest in people before investing in tools

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

[Spring.NET #14] Spring.Core, IoC e DI (Setter Injection)

In questo post vediamo come applicare alla classe PhraseTranslator un banale sistema di log. Itroduciamo una nuova interfaccia che farà da contratto per le varie implementazioni di log (es: Console, File di testo):

   1: public interface ITranslatorLog
   2: {
   3:     void LogTranslation(string phraseToTranslate, string phraseTranslated);
   4: }

come prima cosa creiamo un NullTranslatorLog applicando il pattern NullObject, il quale farà da default logger per la classe PhraseTranslator:

   1: public sealed class NullTranslatorLog : ITranslatorLog
   2: {
   3:     public void LogTranslation(string phraseToTranslate, string phraseTranslated)
   4:     {}
   5: }

ed un semplice ConsoleTranslatorLog che inietteremo con Spring.NET:

   1: public sealed class ConsoleTranslatorLog : ITranslatorLog
   2: {
   3:     public void LogTranslation(string phraseToTranslate, string phraseTranslated)
   4:     {
   5:         Console.WriteLine(String.Format("La frase \"{0}\" è stata tradotta in \"{1}\"", phraseToTranslate, phraseTranslated));
   6:     }
   7: }

procediamo modificando la classe PhraseTranslator inserendo il sistema di log ed eponondolo con una Setter Property:

   1: public class PhraseTranslator
   2: {
   3:     private ITranslator _concreteTranslator = null;
   4:     private ITranslatorLog _log = new NullTranslatorLog();
   5:  
   6:     public ITranslatorLog Log
   7:     {
   8:         set { _log = value; }
   9:     }
  10:  
  11:     public PhraseTranslator(ITranslator concreteTranslator)
  12:     {
  13:         _concreteTranslator = concreteTranslator;
  14:     }
  15:  
  16:     public string Translate(string phraseToTranslate)
  17:     {
  18:         string phraseTranslated = _concreteTranslator.Translate(phraseToTranslate);
  19:  
  20:         _log.LogTranslation(phraseToTranslate, phraseTranslated);
  21:  
  22:         return phraseTranslated;
  23:     }
  24: }

eseguendo l'applicazione non noteremo nessuna differenza con la vecchia implementazione ma basterà dichiarare nel file di cofigurazione la classe ConsoleTranslatorLog ed iniettarla tramite il tag property nella classe PhraseTranslator per vedere i messaggi di log visualizzati nella console:

<object id="ConsoleLog"
        type="SpringSeries.Core.SetterInjection.ConsoleTranslatorLog, 12.SetterInjection" />
<object id="Translator" 
        type="SpringSeries.Core.SetterInjection.PhraseTranslator, 12.SetterInjection">
  <constructor-arg name="concreteTranslator" ref="EngTranslator" />
  <property name="Log" ref="ConsoleLog" />
</object>
Technorati Tags:

Print | posted on mercoledì 3 ottobre 2007 22:39 | Filed Under [ .NET OpenSource Spring.NET ]

Powered by:
Powered By Subtext Powered By ASP.NET