NHibernate继承从父对象创建子对象

本文关键字:对象 创建 继承 NHibernate | 更新日期: 2023-09-27 18:35:31

如果

这是一个愚蠢的问题,我很抱歉,但我似乎无法掌握。

我有2节课,CustomerMember

客户.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,我想知道是否可以将这样的帮助程序放在域层中?

需要一些建议,谢谢!

NHibernate继承从父对象创建子对象

不确定我是否正确,但没有必要在你的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();