2009-04-25 1 views
4

CSLA.netでは、すべてのドメインクラスは非仮想プロパティを含むBusinessbaseから継承する必要があります。CSLA.Net V3.6/NHibernate V2.10; vitualプロパティの必要性を克服する方法

NHibernateを使用する場合、遅延読み込み用の仮想プロパティを実装する必要があります。

CSLA/NHibernateはを使用するには、いくつかのオプションが一緒にあるように見える:NHibernateので

  • スイッチ遅延読み込みをオフにし(これはあまり柔軟なようだが)ドメインクラスで遅延ロードコードを実装
  • は、遅延ロードを残しますNHibernateでオンにしますが、DTOクラスを使用してデータベースにマップし、次にCSLAドメインクラスにデータを転送します

その他のオプションはありますか?正しい方向へのポインタは、非常に高く評価されます。

NHibernateをどのフレームワークでも実際に使用することができると思います。

答えて

2

マップされたすべてのクラスのインターフェイスを作成し、プロキシの作成時にNHibernateがそのインターフェイスを使用するように指定できます。これを行うと、具体的なドメインクラスはインスタンスが初期化されるまで使用されません。

はたとえば、あなたはこのようなあなたのhbm.xmlでそれを行うことができます。しかし

<class name="DomainModel.Entity, DomainModel" table="Entities" proxy="DomainModel.Api.IEntity, DomainModel"> 
    ... 
</class> 

注意を、これはあなたがあなたのマッピングを行うことができますどのように上の制限のカップルを置くこと。たとえば、access="field.*"アクセス戦略を使用することはできません。使用可能な2つの遅延ロード方式については、thisの記事を参照してください。

0

NHibernateマッピングでは、クラスレベルで 'lazy = false'を指定できます。これにより、Hibernateは動的プロキシを使用しないため、仮想プロパティを持つ必要がなくなります。 (これはコレクションの怠惰には影響しません)。

<class name="SomeClass" lazy="false"> 
    <id .... /> 

    <set name="SomeSet" ... > 
    </set> 
</class> 

上記の例では、クラスは 'lazy'としてマップされています。仮想プロパティは必要ありませんが、SomeSetコレクションは遅延読み込みのままです。

1

私は、ビジネスレイヤーとデータアクセスの間にDTOレイヤーを作成するしかないと確信しています。私はこれを多くのプロジェクトでやってきましたが、私はそのプロジェクトで多くの成功を収めました。

あなたのビジネスオブジェクトは、データレイヤーのように見える/感じるべきではないことに注意してください。 CSLAオブジェクトはビジネスレイヤーであり、DataPortal_XYZメソッド内のデータアクセスORMレイヤーから水分を吸収する必要があります。

ユーザー、ロール、およびユーザーロールのデータテーブル構造の簡単な例を取り上げます。ここで、UserRolesは、ユーザーをロールにリンクするリンクテーブルです。これはデータスキーマであり、データを正規化するのには非常に優れています。

あなたのビジネスオブジェクトは、バーチャルを正規化していないので、このようにはなりません。 Userビジネスオブジェクトについて考えると、RoleオブジェクトのリストであるRoleListのプロパティを持つ必要があります。存在の中にUserRoleビジネスオブジェクトは存在してはいけません。これは、データベーススキーマとCSLAオブジェクトから直接アクセスしようとしている場合に発生します。

関連する問題