3

私は現在、ドメイン モデルとリポジトリをアプリケーション プラグインで拡張できるソリューションを設計しています。今、私は以下にリストしているいくつかの問題に出くわしました.

  1. 私の最初の問題は、ドメイン モデルを拡張可能にすることです。ここで継承を使用することを考えていましたが、正直なところ、同じドメイン オブジェクトを拡張する複数のプラグイン アセンブリを活用する方法がわかりません。私は、すべてのドメイン オブジェクトを部分的に作成し、プラグインがこのように拡張できるようにすることに傾倒しています。同じドメイン オブジェクトを拡張する複数のプラグインがある場合、プラグインごとに異なる拡張ドメイン アセンブリをロードすることを心配する必要はありません。実行時にマージされたドメイン オブジェクトは 1 つだけです。これに関するアイデアはありますか?

  2. もう 1 つの問題は、NHibernate マッピング ファイルの拡張です。各アセンブリに、それが拡張しているドメイン オブジェクトのマッピング ファイルを埋め込み、NHibernate マネージャーに、コア ドメインで提供されるものの代わりにそれを読み込ませることができます。繰り返しになりますが、問題は、同じドメイン オブジェクトを拡張する複数のプラグインがある場合です。1 つのプラグインを別のプラグイン オーバーライド マッピング ファイルにすることができます。最後の問題に対する解決策はそれほど素晴らしいものではありませんが、拡張する前に使用した元のマッピング ファイルの署名としてプラグイン アセンブリにチェックサムを含めることを考えていました。読み込み中にこのチェックサムを確認し、チェックサムが一致する場合にのみプラグイン マップを読み込むことができます。かなり醜いですが、少なくとも、プラグイン アセンブリで拡張するために使用されるベース マップとは異なるマップをオーバーライドすることはありません。

とにかく、これについて皆さんがどう思うか聞きたいです。ありがとう!

4

2 に答える 2

0

ドメイン モデルを拡張可能にするために、多くのファクトリを使用します。ファクトリは依存性注入によってスワップ イン/アウトでき、ドメイン オブジェクトはインターフェイスに対してコーディングする必要があります。

マッピングは、たとえば Fluent NHibernate を介して行うことができ、これらはそのプラグイン アセンブリに含まれる可能性があります。

最後に、そのプラグイン アセンブリに読み込み可能な構成を追加します。これにより、DI コンテナーがセットアップされ、新しいマッピングが読み込まれます。メイン アセンブリには、プラグイン構成用のスキャナーが存在する可能性があります。ここでMEFが役立つかもしれませんし、複雑ではない独自のものを作成することもできます。

于 2009-08-24T13:20:34.043 に答える
0

幸いなことに、あなたが求めていることは可能であり、管理するのはそれほど難しくありません。

プラグイン管理については、Microsoft Prism ( http://msdn.microsoft.com/fr-fr/magazine/cc785479.aspx ) を参照してください。これは、モジュラー アプリケーション開発に関する優れた機能です。

について 1.サブクラスを個別のマッピングで、個別のアセンブリでマップできます。NHドキュメントを探してください。サブクラスの別のマッピング ファイルは次のようになります。

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <subclass name="YourClassFullName, YourPluginAssemblyName"
            extends="YourParentClassFullName, TheAssemblyWhereYourBaseClassIsDefined"
            discriminator-value="whateveryouwant">
    ... add your subclass mapping here ...
  </subclass>
</hibernate-mapping>

約 2. コア ドメイン マッピングを維持できます。より簡単な方法は、プラグインが追加のマッピングを登録するために使用できるサービス (IMappingLoader としましょう) を作成することです (基本クラスのマッピングをオーバーライドする必要はありません)。このサービスを実装すると、マッピングが NH 構成クラスに追加されます。たとえば、Microsoft Prism では、すべてのプラグインが IModule インターフェイスを実装する必要があります。このインターフェイスは、ロード時に Initialize() 関数が呼び出されます。この関数は、IMappingLoader サービスを呼び出す理想的な場所です。

それが役に立ったことを願っています。

于 2009-08-24T12:02:51.760 に答える