4

CSLA.netでは、すべてのドメインクラスが非仮想プロパティを含むBusinessbaseから継承する必要があります。

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

CSLA/NHibernateを一緒に使用するためのいくつかのオプションは次のようです。

  • NHibernateで遅延読み込みをオフに切り替え、ドメインクラスに遅延読み込みコードを実装します(ただし、これは柔軟性が低いようです)
  • NHibernateで遅延読み込みをオンのままにしますが、DTOクラスを使用してデータベースにマップしてから、データをCSLAドメインクラスに転送します

他にどのようなオプションがありますか?正しい方向へのポインタは大歓迎です。

上記の質問は、NHibernateを任意のフレームワークで使用する場合に本当に当てはまると思います。

4

4 に答える 4

2

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

たとえば、次のように hbm.xml で実行できます。

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

ただし、これにより、マッピングの実行方法にいくつかの制限が課されることに注意してください。たとえば、access="field.*"アクセス戦略は使用できません。使用できる 2 つの遅延読み込み戦略に関するこの投稿を確認してください。

于 2009-04-25T19:34:13.850 に答える
1

ビジネス層とデータ アクセスの間に DTO 層を作成することが唯一の正しい方法だと思います。私は多くのプロジェクトでこれを行い、多くの成功を収めてきました。

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

たとえば、UserRoles がユーザーをロールにリンクするためのリンク テーブルである、Users、Roles、および UserRoles データ テーブル構造の簡単な例を考えてみましょう。これはデータ スキーマであり、データの正規化に非常に適しています。

ビジネスオブジェクトは、動作を正規化していないため、このように見えるべきではありません。User ビジネス オブジェクトについて考える場合、Role オブジェクトのリストである RoleList のプロパティが必要です。存在する UserRole ビジネス オブジェクトがあってはなりません。これは、データベース スキーマおよび CSLA オブジェクトから直接移動しようとした場合に発生します。

于 2009-05-27T06:36:31.477 に答える
1

CSLA.Nhibernate を箱から出して試すか、同じことからいくつかのヒントを得ることができます。

CSLA.Nhibernate は、codeplex の CSLAContrib の一部です。 http://cslacontrib.codeplex.com/SourceControl/changeset/view/46985#302175

久しぶりの活動。しかし、実装されているものは何でもうまく機能しています。SVN パス: https://cslacontrib.svn.codeplex.com/svn/ProjectTrackerNHibernate

于 2009-05-25T09:17:28.940 に答える
0

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

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

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

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

于 2009-05-25T09:23:56.977 に答える