我正在开发我的第一个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项目中来实现这一点,但我希望将它们分开,因为业务类应该是应用程序表单的规则所在的位置。
答案 0 :(得分:0)
为什么在数据项目中有EnrolmentApplication类?
NHibernate是关于将您的域层(带有相应的业务对象)映射到您的数据库。
所以你应该有两个项目:
您的数据项目应该引用域项目,而不是反过来。
之后,您可以随心所欲地拥有服务层或应用程序层或UI层,这显然会引用域项目,并在某些时候触发数据项目映射。
如果您希望将ApplicationForm类序列化为XML,我将创建一个IUserType来执行此操作(通用的IXmlSerializedUserType或不太通用的IApplicationFormUserType将执行此操作)。
然后,您可以将ApplicationForm(以非序列化形式)作为EnrolmentApplication类的属性,这意味着它被序列化为XML的事实对应用程序层是隐藏的,并且只是数据层的关注点。