如何在单独的项目中构造nhibernate类

时间:2010-06-21 05:58:58

标签: c# nhibernate

我正在开发我的第一个NHibernate项目,并有以下设置/要求。

我有2个项目xx.Data和xx.Business。在Data项目中,这是我的域类,映射文件所在的位置。我正在做的是创建一个在线应用程序,我有一个SQL表,存储ID,修改日期和存储应用程序表单详细信息的XML字段。这将映射到EnrolmentApplication域类。

将xml反序列化为ApplicationForm类,此类目前位于xx.Business项目中。业务项目引用数据项目。

我开始使用我的代码创建一个新的ApplicationForm,序列化为xml,然后将EnrolmentApplicaiton属性设置为xml字符串,然后保存,我认为这是一种糟糕的做事方式。

我接下来认为我应该在EnrolmentApplication类中有一个属性,它具有get / set属性来为我序列化/反序列化xml属性,但是,我要么必须将ApplicationForm类移动到Data项目中,要么创建另一个继承自EnrolmentApplication的类,即

using xx.Data;
namespace xx.Business
{
public class EForm : EnrolmentApplication
{
    public EForm(Guid applicationID) : base(applicationID)
    {}
}
}

我的问题是从数据库加载EnrolmentApplication。我不想做以下事情:

EnrolmentApplication form = NHibernateSession.Linq<EnrolmentApplication>().SingleOrDefault(x => x.appID);
this.ApplicationXML = form.ApplicationXML;
this.DateModified = form.DatModified;
...

我可以通过将ApplicationForm类移动到Data项目中来实现这一点,但我希望将它们分开,因为业务类应该是应用程序表单的规则所在的位置。

1 个答案:

答案 0 :(得分:0)

为什么在数据项目中有EnrolmentApplication类?

NHibernate是关于将您的域层(带有相应的业务对象)映射到您的数据库。

所以你应该有两个项目:

  • 域项目 - 业务活动
  • 数据项目 - 映射文件和存储库

您的数据项目应该引用域项目,而不是反过来。

之后,您可以随心所欲地拥有服务层或应用程序层或UI层,这显然会引用域项目,并在某些时候触发数据项目映射。

如果您希望将ApplicationForm类序列化为XML,我将创建一个IUserType来执行此操作(通用的IXmlSerializedUserType或不太通用的IApplicationFormUserType将执行此操作)。

然后,您可以将ApplicationForm(以非序列化形式)作为EnrolmentApplication类的属性,这意味着它被序列化为XML的事实对应用程序层是隐藏的,并且只是数据层的关注点。