0

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

我有 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,我想知道是否可以将这样的助手放在域层中?

需要一些建议,谢谢!

4

1 回答 1

1

不确定我是否正确,但在你的课堂上不需要做任何Customer相关的事情。Member您只需要告诉 NHibernate Member 派生自 Customer,并且您需要为这两个类提供正确的映射。就是这样,其余的会自动进行(无论如何,这就是 OOP 中继承的全部意义)。

关于你的第二个问题('不要在 c'tor 中调用 virtuals。'):这在理论上是正确的,但只有在派生类中有可能覆盖虚拟方法时才相关。因此,您可以放心地忽略此处的 R# 警告。

但我认为在这里完全摆脱 Member 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();
于 2013-10-15T14:19:31.093 回答