NHibernate继承从父对象创建子对象
本文关键字:对象 创建 继承 NHibernate | 更新日期: 2023-09-27 18:35:31
这是一个愚蠢的问题,我很抱歉,但我似乎无法掌握。
我有2节课,Customer
和Member
。
客户.cs
public class Customer
{
public virtual string Firstname { get; set; }
public virtual string Middlename { get; set; }
public virtual string Lastname { get; set; }
}
会员.cs
public class Member : Customer
{
public virtual string MemberId { get; set; }
public virtual string MemberRegistrationDate { get; set; }
public virtual string MembershipStatus { get; set; }
public Member()
{
MemberRegistrationDate = DateTime.Now;
MembershipStatus = MembershipStatusEnum.Active;
}
}
我很确定这一定是一种遗产,其中会员是客户,尽管如果我绝望,我可以求助于组合。
请注意,这里我使用的是NHibernate,这迫使我使用所有这些虚拟。
给定单个客户对象,现有客户的新成员应该如何?
我可以在这里想到 2 个选项:
1 - 使用 Member.cs 构造函数重新创建其父属性
这是一件好事吗?我试图这样做:
public class Member : Customer
{
public virtual string MemberId { get; set; }
public virtual string MemberRegistrationDate { get; set; }
public virtual string MembershipStatus { get; set; }
public Member(Customer customer)
{
Firstname = customer.Firstname;
Middlename = customer.Middlename;
Lastname = customer.Lastname;
MemberRegistrationDate = DateTime.Now;
MembershipStatus = MembershipStatusEnum.Active;
}
}
但是Resharper警告我不要在构造函数中访问虚拟成员,我同意避免这样做,并告诉我使Member成为一个不能有虚拟成员的密封类(没有NHibernate兼容性)。
当有一天我向 Customer 类添加一个新属性时,它也引发了另一个问题,而我忘记对 Member 构造函数执行相同的操作。
2 - 使用某种反射助手在两个对象之间映射。
当然这是一个可行的选择,但我目前正在学习 DDD,我想知道是否可以将这样的帮助程序放在域层中?
需要一些建议,谢谢!
不确定我是否正确,但没有必要在你的Member
课上做任何Customer
相关的事情。您只需要告诉 NHibernate 成员派生自客户,并且您需要为这两个类提供正确的映射。就是这样,其余的会自动进行(无论如何,这就是 OOP 中继承的全部意义)。
关于你的第二个问题("不要在c'tor中调用virtuals"):这在理论上是正确的,但只有在虚拟方法有可能在派生类中被覆盖时才有意义。因此,您可以安全地忽略此处的 R# 警告。
但我认为这里最干净的是完全摆脱成员 c'tor 并像这样声明类:
public class Member : Customer
{
private memberRegistrationDate = DateTime.Now;
private membershipStatus = MembershipStatusEnum.Active;
public virtual string MemberId { get; set; }
public virtual string MemberRegistrationDate
{
get { return this.memberRegistrationDate; };
set { this.memberRegistrationDate = value; };
}
public virtual string MembershipStatus
{
get { return this.membershipStatus; };
set { this.membershipStatus = value; };
}
}
编辑:如果您正在寻找一种将客户转变为会员的简单方法,您可能应该完全将转换代码远离您的类,并将其放入扩展方法中(以保持整洁):
public static class CustomerExtensions
{
public static Member ToMember(this Customer customer)
{
var member = new Member();
member.Firstname = customer.Firstname;
member.Middlename = customer.Middlename;
member.Lastname = customer.Lastname;
return member;
}
}
你可以这样称呼它:
Member member = customer.ToMember();