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:
Spring.NET