2012-05-25 12 views
12

Estamos en proceso de rediseñar un software heredado para que sea más comprobable y hemos decidido que Dependency-Injection y Castle.Windsor nos ayuden.Patrón Multiple Decorator en castle-windsor

En primer lugar, nuestro objetivo: * Una serie de decoradores que funcionan en una secuencia de datos. * Son posibles múltiples combinaciones de decoradores y los nodos raíz en cada caso pueden ser necesarios para obtener datos de diferentes lugares.

Técnicamente, nuestro diseño es el siguiente:

interface IUpdateableValue<T> 
{ 
    T Get(); 
}; 

Tenemos, por ejemplo, tres conjuntos de datos se recuperen con un número de componentes, toda la implementación IUpdateableValue() (pseudo-código):

JsonParser(
    Decompressor(
     Decrypter(decryptionKey 
      FileCache(filename, 
       HttpWebDownloader(url)))) 

XmlParser(
    Decompressor(
     Decrypter(decryptionKey2 
      FileCache(filename2, 
       HttpWebDownloader(url2)))) 

estoy teniendo problemas para salir de diseño para caber en un marco como el DI-Castillo-Windsor . Sospecho que algunas de ellas podrían ser manejadas por instancias nombradas, pero esto parece mal para este uso.

La idea es que el "usuario" de, p. las instancias JsonParser y XmlParser no saben (ni se preocupan) si los datos provienen de un HttpUrl, un archivo o mágicamente se quitaron de un sombrero.

Estoy pensando que hay algo mal en nuestro diseño, pero no estoy seguro de cómo solucionarlo.

¿Alguna idea sobre cómo progresar?

+0

Hay preguntas sobre el trabajo con decoradores genéricos en Windsor aquí en SO (como [este] (http://stackoverflow.com/questions/9888019)), pero no recuerdo que se haya respondido a nadie, por lo que Espero que esto sea difícil de hacer con Windsor. Otros contenedores, como Autofac o Simple Injector, pueden tener más éxito. Tal vez [esta página wiki sobre el registro de decoradores genéricos] (http://simpleinjector.codeplex.com/wikipage?title=Advanced-scenarios#Generic_Decorators) en Simple Injector podría darte algunas ideas sobre cómo diseñar tu sistema. – Steven

+1

¿Por qué usaría Castle para esto? ¿Qué beneficios proporcionará? –

Respuesta

13

Con Castle Windsor puede configurar implícitamente los decoradores registrándolos en el orden correcto. Es necesario registrar la primera decorater exterior:

container.Register(Component 
    .For<IUpdateableValue>() 
    .ImplementedBy<JsonParser>()); 
container.Register(Component 
    .For<IUpdateableValue>() 
    .ImplementedBy<Decompressor>()); 
container.Register(Component 
    .For<IUpdateableValue>() 
    .ImplementedBy<Decrypter>()); 
... 

Al resolver IUpdateableValue casta Windsor será conectar automáticamente las dependencias, por lo que se anidan correctamente.

+4

Como nota al margen: Hay 'IsDefault' que instruirá a windsor para resolver un componente específico por defecto. Entonces el orden de registro no importa. – ChrisWue