2017-04-15 13 views
0

私はリポジトリアセンブリを含むアプリケーションを持っています。アプリケーションが最初にインストールされるとき、リポジトリは非常に単純です:ローカルJSONファイルストア。しかし、私はエンド・ユーザーに別のリポジトリー・ストア(SQL、Oracleなど)を使用できるようにしたいと考えています。アプリケーションのリポジトリアセンブリを置き換えるための推奨される方法

アプリケーションのディレクトリにある元のリポジトリDLLを新しいリポジトリDLLに置き換えるだけで簡単ですか?もしそうなら、ユーザーは単純に新しいリポジトリDLLをコピーしてアプリケーションのディレクトリに貼り付け、元のDLLを上書きしますか?これを行うより良い方法はありますか?

私はまた、アプリケーションで使用されるすべてのインターフェイスを含む別のアセンブリをアプリケーションに持っています(これは良い方法ですか)。アプリケーションは、リポジトリアセンブリが必要なすべてのインタフェースを実装していることを確認します。

私はプラグインアーキテクチャ/フレームワークを望んでいないと思います。私はロードされたリポジトリアセンブリのセットから1つを選択する能力を望んでいません。しかし、私は自分のアプリケーションのためのプラグイン戦略を支持する議論に耳を傾けるでしょう。

答えて

0

この問題にはいくつかのアプローチがありますが、質問からどちらがあなたのニーズに適しているかわかりません。

  1. あなただけが静的にこれらを参照することができ、アプリケーションが起動時にロードすることができたDLLにあるいくつかの実装の中で行動を選択する必要がある場合。起動時に、ロードされたアセンブリのAppDomain(AppDomain.GetAssemblies()メソッドのチェック)およびクラスをアセンブリ内で参照し、使用可能なビヘイビアのディクショナリを構築できます。このディクショナリを使用して、後でビヘイビアを切り替えることができます。

  2. 実行時にDLLファイルを実際に処理する必要がある場合は、AppDomain.Load()メソッドをチェックします。これらのメソッドを使用すると、現在のAppDomainで新しいアセンブリを動的に読み込むことができます。これらのアセンブリ内のクラスは、実際に呼び出される対応する共通インタフェースにキャストできます。ただし、アセンブリをロードするのは簡単ですが、アンロードする必要がある場合はアンロードすることはできません。

  3. アセンブリを動的に読み込んでアンロードする必要がある場合は、異なるAppDomain内で処理する必要があります(AppDomain.Unload()メソッドをチェックしてください)。さらに、AppDomains間のメソッド呼び出しを直接行うことはできません。これらはマーシャリングが必要となり、コードの複雑さが増します。

これは、これらのソリューションの概要である、それらの一つ一つを詳細記事...

+0

おかげで、avatがあります。私は、ユーザーがより大きい組織の一部であり、リポジトリのタイプ(SQL、Oracleなど)が組織によって指定されていると仮定しています。したがって、リポジトリDLLは、プログラムがインストールされたときや、すぐ後で使用されるたびに、一度だけ選択されます。したがって、状況は最初のシナリオに最も似ていますが、選択は一度だけ発生します。 – blueshift

関連する問題