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.*"访问策略。查看这篇文章,了解可以使用的两种延迟加载策略。

于 2009-04-25T19:34:13.850 回答
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 回答
1

我相信唯一正确的做法是在您的业务层和数据访问之间创建一个 DTO 层。我在许多项目中都这样做过,并且取得了很大的成功。

请记住,您的业务对象不应看起来/感觉像您的数据层。CSLA 对象是您的业务层,应该从您的 DataPortal_XYZ 方法中的数据访问 ORM 层进行补充。

例如,一个简单的用户、角色和用户角色数据表结构示例,其中用户角色是一个链接表,用于将用户与角色联系起来。这是您的数据架构,它非常适合规范化您的数据。

您的业​​务对象不应看起来像这样,因为这不会使行为正常化。在考虑 User 业务对象时,它应该具有 RoleList 的属性,它是 Role 对象的列表。不应该存在 UserRole 业务对象。如果您尝试直接从数据库模式和 CSLA 对象中获取,就会发生这种情况。

于 2009-05-27T06:36:31.477 回答
0

您可以在类级别的 NHibernate 映射中指定“lazy=false”。这将消除对虚拟属性的需求,因为 NHibernate 将不会使用动态代理。(这不会影响集合的惰性)。

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

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

在上面的示例中,该类被映射为“惰性”。您将不需要虚拟属性,但 SomeSet 集合可以保持延迟加载。

于 2009-05-25T09:23:56.977 回答