2012-05-25 7 views
12

Wir sind dabei, einige Legacy-Software neu zu entwickeln, um mehr testbar zu sein und haben uns für Dependency-Injection und Castle.Windsor entschieden, um uns zu helfen.Multiple Decorator Muster in Burg-Windsor

Zuerst unser Ziel: * Eine Reihe von Dekoratoren, die alle an einem Datenstrom arbeiten. * Mehrfache Kombinationen der Dekoratoren sind möglich und die Wurzelknoten können in jedem Fall erforderlich sein, um Daten von verschiedenen Orten zu erhalten.

Technisch unser Design ist wie folgt:

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

Wir haben zum Beispiel drei Sätze von Daten mit einer Reihe von Komponenten abgerufen, alle Implementierung IUpdateableValue() (Pseudo-Code) werden:

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

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

Ich habe Probleme beim Design immer aus in einen DI-Framework wie Castle-Windsor passen . Ich vermute, ein Teil davon könnte von benannten Instanzen behandelt werden, aber das scheint für diese Verwendung stinkend zu sein.

Die Idee ist, dass der "Benutzer" von z.B. Die Instanzen JsonParser und XmlParser wissen nicht (oder interessieren sich), ob Daten von einer HttpUrl stammen, einer Datei oder magisch aus einem Hut gezogen werden.

Ich denke, es ist etwas falsch in unserem Design, aber nicht sicher, wie es zu beheben ist.

Irgendwelche Ideen, wie man fortschreitet?

+0

Es gibt Fragen über die Arbeit mit generischen Dekoratoren in Windsor hier auf SO (wie [diese] (http://StackOverflow.com/Questions/9888019)), aber ich kann mich nicht erinnern, jemand beantwortet, so Ich erwarte, dass dies mit Windsor schwer zu tun ist. Andere Container, wie Autofac oder Simple Injector, könnten mehr Erfolg bringen. Vielleicht gibt Ihnen [diese Wiki-Seite über die Registrierung von generischen Dekoratoren] (http://simpleininstor.codeplex.com/wikipage?title=Advanced-scenarios#Generic_Decorators) in Simple Injector einige Ideen, wie Sie Ihr System gestalten können. – Steven

+1

Warum würden Sie Castle dafür verwenden? Welche Vorteile bietet es? –

Antwort

13

Mit Castle Windsor können Sie Dekorierer implizit konfigurieren, indem Sie sie in der richtigen Reihenfolge registrieren. Sie müssen die äußeren decorater registrieren zuerst:

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

Wenn Sie IUpdateableValue Caste Windsor lösen automatisch die Abhängigkeiten verdrahten, so dass sie korrekt verschachtelt sind.

+4

Als Randnotiz: Es gibt 'IsDefault', das windsor anweist, eine bestimmte Komponente standardmäßig aufzulösen. Dann spielt die Reihenfolge der Registrierung keine Rolle. – ChrisWue