0

タイプのリストがあります。名前でリスト内の一致するタイプを見つける必要があります。そのようなタイプが存在する場合は、そのインスタンスを取得する必要があります。タイプのリストは、グローバル構成の役割を果たし、アプリ用に構成されたすべてのものを格納する静的クラスに格納されます。タイプのリストのインターフェイスを外部に表示する正しい方法は何ですか?名前でタイプを簡単に検索し、必要なタイプを取得し、静的クラスにメソッドを入れすぎないようにします。あまりにも多くのデータを楽しんではいけません。

IConfigurationSearchable のように、名前でタイプを検索できるインターフェイスを配置することを考えていました。Configuration がこのインターフェイスを返すようにし、それに対してすべてを実装します。柔軟性があり、Configurator インターフェイスを汚染しません。しかし、これを行うより良い方法がないことを確認するために、SO に依頼することにしました。

いくつかのクラスを追加できる静的クラスがあります。このような:

configuration.Add(new Test()); configuration.Add(new AnotherTest()); configuration.Add(new SomeFancyName());

コレクションに含まれる Test という名前のクラスをチェックできるインターフェイスが必要です。おそらく後で、Test で始まるクラスがコレクション内にあるかどうかを確認することにします。また、そこに含まれるクラスまたはそこに含まれるクラスのリストを名前で取得する必要があります。そのため、物事は変化する可能性があり、コンフィギュレーターへのインターフェースを作成する方法がわからないため、変更をより簡単に実行できるようになります。

4

2 に答える 2

1

TinyIoCなどの単純な依存性注入コンテナを調べることができます: https ://github.com/grumpydev/TinyIoC

これにより、次のようなタイプのインスタンスを登録できます。

// register Foo
container.Register<Foo>();
...
// later on, get this instance by using:
var instance = container.Resolve<Foo>();

またはさらに良いことに、インターフェースと実装を登録し、コードの後半で、インターフェースを使用するだけです。

// register Foo as the concrete implementation of IFoo
container.Register<IFoo, Foo>();
...
// later on, get a concrete instance that implements the IFoo interface
var foo = container.Resolve<IFoo>();

これにより、Foo実装を変更する柔軟性が得られますが、Foo実装を使用するコードは、IFooインターフェイスのみに依存します。

于 2012-11-12T20:59:01.697 に答える
0

わかりました、私自身の質問に答えたくありませんが、回答の数が比較的少ないためです(1)。私自身の後に投稿した良い回答を回答としてマークしてもかまいません。

インターフェイス IGetTestable() を作成し、シングルトン構成からメソッドとして返します。したがって、実装に関して何か変更があった場合は、実装を変更するだけで済みます。

また、コレクションとやり取りする方法は、構成オブジェクトとそのメソッドの周りで壊されていません。

于 2012-11-21T19:09:44.787 に答える