2011-10-28 11 views
0

私はFluent NHibernateの慣習のセットを持っています。ほとんどのものはデータベースに依存しません。しかし、文字列プロパティのために、このような1依存DBMSあるカップルがあります:Fluent NHibernateのDB固有の規約

Public Sub Apply(ByVal instance As IPropertyInstance) Implements IConvention(Of IPropertyInspector, IPropertyInstance).Apply 
    instance.CustomSqlType("VARCHAR2(50 BYTE)") 
End Sub 

本当に私は、DBの世代のためにこの1(すなわち、最初の開発オブジェクト)のような規則を使用します。これはすべてうまくいっていますが、Oracleにはうまくいきますが、メモリ内のSQLite DBを使って単体テストを行いたいのですが、SQLiteにはVARCHAR2型がないため、このコンベンションは動作しません。

このような状況でFluent NHibernateをどのように設定するかについてのアドバイスや参考資料はありませんか?

現時点では、データベースに依存せず、サブディレクトリ/名前空間に従属する規則を持つ一般的な一連の規則を考えています。次に、特定のDBMSに関連付けられているものと同様に、すべての一般的な慣習を取り上げるカスタムITypeSourceコンポーネントを指定できるような設定をします。 SqlConventionTypeSource、OracleConventionTypeSource ...

親切に、 ライアン。

答えて

0

一般的に、実行可能ファイルには(流暢な設定と同様に)慣習を設定します。

これは、GUI、ユニットテスト、およびISession/ISessionFactoryベースのサービスを消費している状況で、流暢な設定が異なることを意味します。

あなたの設定はハードコードされているように聞こえ、環境に関する情報によっては、「コンフィギュレータ」を別の方法で動作させる方法を見つけようとしています。

より簡単な方法は、最上位レベルで構成を作成し、それを必要に応じて依存関係として提供することです。そうすれば、異なる環境から同じコードパスに慣れさせられることはありません。

NHibernateに依存するものは何でも、コンストラクタの引数またはプロパティの設定者としてISessionまたはISessionFactoryを受け入れるように設定します。そうすれば、この問題は起こりません。実際にデータストアを照会する必要がないテストのために、それを嘲笑することさえできます。

もちろん、FNH設定を作成するすべてのクラスを設定可能にしておき、設定行に条件文を使用することもできます。しかし、通常、FNHの設定はあまりにも少ないコード行で始めるので、それほど価値があるとは思われません。 SQL Server、Oracle、SQLiteなどのための完全に別々の構成を作成するだけです。マイナーな変更を行うたびに、それを常に維持する必要はありません。

+0

応答に感謝します。 –

+0

FYI; Windsor IoCでNHibernateを設定するには、Castle.Facilities.NHibernateIntegrationライブラリを使用します。このようにして、NHibernateを使用するすべてのサービス/プレゼンターは、必須/オプションのクラス依存としてISessionManagerを使用して作成できます。私がサービスを解決すると、WindsorはISessionManagerの具体的な実装を注入します。基本的には、この機能を使用してセッション管理(セッションごとのオープンセッションなど)について心配する必要はあまりありません.ISessionManagerを巧みに使って単体テストを行うことができます。 –

+0

機能IConfigurationBuilderインターフェイスを介してセッションファクトリのデフォルト設定を変更することができます。ここでは、NHibernateセッションファクトリを流行のある自動マッピングを使って流暢に設定します。私はFNHのAutoPersistenceModelにどこで慣習を見つけるべきかを伝える必要があります。これはかなり複雑で、明確に定義されており、変更することはないと考えられるので、再利用の良い候補です。これは私の慣習のうちのいくつかがDB特有のもの(すなわち、スキーマを生成するために使用されるもの)であるという私の元の問題に戻る。 –