In merito alla configurazione e alla personalizzazione di ICallHandler e IMatchingRule per il PolicyInjection Application Block della Enterprise Library, appunto in questo post alcune notazioni relative al passaggio dalla versione 4 (maggio 2008) alla 5 (aprile 2010). Il refactoring della libreria e l’introduzione di Unity come dipendenza base di molti Application Block non ha risparmiato alcune incompatibilità con le precedenti versioni. In rete non ho trovato molto in merito, per questo la decisione di appuntare la cosa in forma di bozza sul blog.
Nella precedente versione se volevamo introdurre elementi custom caricabili dinamicamente da configurazione occorreva implementare una coppia di classi: una prima classe – derivante implicitamente da ConfigurationElement - che si occupa della lettura/normalizzazione dei dati dalla configurazione e una seconda classe – derivante da IAssembler – che si occupa della creazione effettiva della componente a fronte delle configurazioni. La classe di configurazione si preoccupava di indicare la classe factory tramite attributo, AssemblerAttribute.
Nella versione 5 è stata eliminata la classe derivante da IAssembler; il compito della creazione della componente e della lettura della configurazione sono state collassate in una sola classe. Ecco a codice come ho rivisto le componenti per la creazione e la configurazione di un ICallHandler custom per la scrittura di log.
Nessuna variazione alla componente che posso portare AS IS.
[ConfigurationElementType(typeof(LogCallHandlerData))]
public class LogCallHandler: ICallHandler
{
//...
}
Eliminazione della classe LogCallHandlerAssembler (e dei riferimenti alla classe) e implementazione del metodo GetRegistrations in LogCallHandlerData. La documentazione in merito mi sembrava davvero lacunosa. Per capire come dovesse essere implementata ho sbirciato il codice di EntLib per capire come sono state implementate alcune componenti embedded nella libreria.
//[Assembler(typeof(LogCallHandlerAssembler))]
public class LogCallHandlerData : CallHandlerData
{
public LogCallHandlerData()
{
}
public LogCallHandlerData(string handlerName)
: base(handlerName, typeof(LogCallHandler))
{
}
public override IEnumerable<TypeRegistration> GetRegistrations(string nameSuffix)
{
yield return
new TypeRegistration<ICallHandler>(() => new LogCallHandler())
{
Name = this.Name + nameSuffix,
Lifetime = TypeRegistrationLifetime.Transient
};
}
}
//public class LogCallHandlerAssembler : IAssembler<ICallHandler, CallHandlerData>
//{
// #region IAssembler<ICallHandler,CallHandlerData> Members
// public ICallHandler Assemble(IBuilderContext context, CallHandlerData objectConfiguration, IConfigurationSource configurationSource, ConfigurationReflectionCache reflectionCache)
// {
// return new LogCallHandler();
// }
// #endregion
//}
oO0( spero che il post possa evitare che qualcun altro si disperi)
posted @ mercoledì 15 settembre 2010 15:41