1

以下を実現するための設計手法を探しています。

  • データを読み取るための 2 つの異なるデータ ソース
  • データ ソースを動的に追加または削除できるようにする必要がある

私がこれまでに行ったことは、次のものを作成したことです。

IDataProvider 
- StartReadData()
- EndReadData()
- List<DataObjs> (contains data)

   XmlDataProvider : IDataProvider
   CsvDataProvider : IDataProvider

IDataProviderManager
- List<IDataProvider> (has a collection of dataprovider)

  DataProviderManager : IDataProvideManager

現在、IDataProviders をインスタンス化し、構成可能な方法で管理できる (コードを変更したり再コンパイルしたりせずに IDataProviders クラスを追加または削除する)より良い手法を探しています。

優れた設計手法や同様のコードへのリンクは大歓迎です。

どうもありがとう。

4

3 に答える 3

2

プロバイダーを別のアセンブリに保持している限り、それらを構成ファイルで定義し、実行時にインスタンス化できます。

 <DataProviders>
 <provider name="XmlDataProvider" 
      type="Separate.Assembly.Providers.XmlDataProvider, Separate.Assembly"/>
<provider name="CsvDataProvider" 
      type="Separate.Assembly.Providers.CsvDataProvider, Separate.Assembly"/>
</DataProviders>

次に、コードで構成を読み取って解析し、型を動的にロードする必要があります。

于 2012-10-09T10:41:53.993 に答える
1

毎回再コンパイルしたくない場合は、独自のソリューションと@StuartDunkeldが提供するソリューションを組み合わせて解決することができます。

  1. のようなインターフェースを定義しますIDataProvider
  2. いくつかの構成セクションハンドラー(実装IConfigurationSectionHandler)を記述し、アプリケーション構成ですべてのデータプロバイダー(実装するクラスIDataprovider)を構成します。
  3. 特定のタイプの構成済みデータプロバイダーをロードする「manager」クラスを追加します。IUnityContainerのようなものを使用して、依存関係を認識し、それを解決することができます。
于 2012-10-09T11:13:15.047 に答える
0

ファクトリパターンを使用して、最初のステップとしてプロバイダーのインスタンス化を抽象化します。

そのファクトリでは、設定、リフレクションなど、どちらの方法でも実装を行うことができます。

しかし、私の推測では、IoCコンテナーは、あなたが望むことを正確に実行しているため、長期的にはIoCコンテナーを使用することになります。

ほとんどのコンテナは、アセンブリをスキャンして、再コンパイルせずにアプリケーションに対して透過的にインポートできます。

独自のソリューションを考案することに時間を費やすのではなく、DIを理解するために少し時間を費やすことをお勧めします。(これはあまりにもところで学ぶべきものになるでしょう)

ファクトリを使用すると、自分に合った最終的なソリューションを見つけたときに、アプリケーションを壊すことなく実装を変更できます。

于 2012-10-09T10:37:37.177 に答える