2012-05-25 13 views
12

Siamo in procinto di riprogettare alcuni software legacy per essere più testabili e abbiamo deciso di utilizzare Dependency-Injection e Castle.Windsor per aiutarci.Motivo decorativo multiplo nel castello-windsor

In primo luogo, il nostro obiettivo: * Un numero di decoratori che funzionano tutti su un flusso di dati. * Sono possibili combinazioni multiple di decoratori e i nodi radice in ciascun caso possono essere richiesti per ottenere dati da luoghi diversi.

Tecnicamente, il nostro disegno è la seguente:

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

Abbiamo per esempio tre serie di dati che devono essere recuperati con un numero di componenti, tutte attuazione IUpdateableValue() (pseudo-codice):

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

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

Sto avendo difficoltà a raggiungere fuori design per adattarsi in un DI-quadro come il Castello di Windsor- . Sospetto che alcuni possano essere gestiti da istanze nominate, ma questo sembra maleodorante per questo utilizzo.

L'idea è che "l'utente" di ad es. le istanze di JsonParser e XmlParser non sanno (o si preoccupano) se i dati provengono da un HttpUrl, da un file o magicamente estratti da un cappello.

Sto pensando che c'è qualcosa di sbagliato nel nostro design, ma non so come risolverlo.

Qualche idea su come procedere?

+0

Ci sono domande su come lavorare con decoratori generici in Windsor qui su SO (come [questo qui] (http://stackoverflow.com/questions/9888019)), ma non ricordo che qualcuno abbia ricevuto una risposta, quindi Mi aspetto che questo sia difficile da fare con Windsor. Altri contenitori, come Autofac o Simple Injector, potrebbero avere più successo. Forse [questa pagina wiki sulla registrazione di decoratori generici] (http://simpleinjector.codeplex.com/wikipage?title=Advanced-scenarios#Generic_Decorators) in Simple Injector potrebbe darti qualche idea su come progettare il tuo sistema. – Steven

+1

Perché dovresti usare Castle per questo? Quali benefici fornirà? –

risposta

13

Con Castle Windsor è possibile configurare implicitamente i decoratori registrandoli nell'ordine corretto. È necessario registrare il decorater esterna prima:

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

Quando si risolve IUpdateableValue Casta Windsor accrediterà automaticamente le dipendenze, in modo che siano annidati correttamente.

+4

Come nota a margine: Esiste 'IsDefault' che istruirà windsor a risolvere un componente specifico per impostazione predefinita. Quindi l'ordine di registrazione non ha importanza. – ChrisWue