14

私たちは、よりテストしやすいようにいくつかのレガシーソフトウェアを再設計している最中であり、Dependency-InjectionとCastle.Windsorが私たちを助けることを決定しました。

まず、私たちの目標は次のとおりです。*すべてがデータストリームで機能する多数のデコレータ。*デコレータの複数の組み合わせが可能であり、それぞれの場合のルートノードは、異なる場所からデータを取得するために必要になる場合があります。

技術的には、私たちのデザインは次のとおりです。

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

たとえば、いくつかのコンポーネントを使用して取得する3セットのデータがあり、すべてIUpdateableValue()(擬似コード)を実装しています。

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

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

Castle-WindsorのようなDIフレームワークに合うようにデザインを作成するのに問題があります。名前付きインスタンスで処理できるものもあると思いますが、これはこの使用法では臭いようです。

たとえば、JsonParserおよびXmlParserインスタンスの「ユーザー」は、データがHttpUrl、ファイル、または魔法のように帽子から引き出されたものであるかどうかを知りません(または気にしません)。

デザインに問題があると思いますが、修正方法がわかりません。

進歩する方法について何かアイデアはありますか?

4

1 に答える 1

18

Castle Windsor を使用すると、正しい順序でデコレーターを登録することにより、暗黙的にデコレーターを構成できます。最初に外側のデコレータを登録する必要があります。

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

IUpdateableValue を解決すると、Caste Windsor は自動的に依存関係を結び付け、正しくネストされます。

于 2012-05-29T22:13:20.147 に答える