2009-08-24 6 views
3

私は現在、ドメインモデル&アプリケーションプラグインによってリポジトリを拡張できるソリューションを設計しています。今、私はいくつかの問題に出くわしました。NHibernateを使った拡張可能なドメインモデル

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

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

いずれにしても、あなたの意見を聞いてみたいです。ありがとう!

答えて

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 Configurationクラスにマッピングが追加されます。たとえば、Microsoft Prismでは、すべてのプラグインがIModuleインターフェイスを実装する必要があります。このインターフェイスは、Initialize()関数が読み込まれるときに呼び出されます。この関数は、IMappingLoaderサービスを呼び出すのに理想的な場所です。

希望しました。

+0

ありがとうございました!私はサブクラス属性について簡単に読んで覚えていますが、決してあまり考えなかったのです。 NHでこれを行う能力は、私が思ったよりもはるかに簡単になります。 –

0

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

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

最後に、DIコンテナをセットアップして新しいマッピングをロードするプラグインアセンブリにロード可能な構成を追加します。主アセンブリの場合、プラグイン構成用のスキャナがあります。たぶんMEFが役に立つかもしれないし、自分で作ることもできますが、それは複雑ではありません。

関連する問題