0

ばかげた質問で申し訳ありませんが、把握できないようです。

私は2つのクラスを取得CustomerMemberました。

Customer.cs

public class Customer
{
    public virtual string Firstname { get; set; }
    public virtual string Middlename { get; set; }
    public virtual string Lastname { get; set; }
}

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()
    {
        MemberRegistrationDate = DateTime.Now;
        MembershipStatus = MembershipStatusEnum.Active;
    }
}

MemberがCustomerである継承である必要があると確信していますが、必死になっている場合は構成に頼ることができます。

ここでは、すべての仮想を使用するように強制する NHibernate を使用していることに注意してください。

単一の顧客オブジェクトが与えられた場合、既存の Customer から新しい Member をどのようにする必要がありますか?

ここで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 - ある種のリフレクション ヘルパーを使用して 2 つのオブジェクト間をマッピングします。

確かにそれは実行可能なオプションですが、私は現在 DDD について学んでおり、そのようなヘルパーをドメイン層に配置しても問題ないのでしょうか?

いくつかの提案が必要です、ありがとう!

4

1 に答える 1

1

正しいかどうかわかりませんが、クラスCustomerで関連することは何もする必要はありません。MemberMember が Customer から派生していることを NHibernate に伝えるだけでよく、両方のクラスに正しいマッピングを提供する必要があります。それだけです。残りは自動的に行われます (とにかく、これが OOP における継承の要点です)。

2番目の問題(「c'torで仮想を呼び出さないでください。」)について:これは理論的には正しいですが、仮想メソッドが派生クラスで上書きされる可能性がある場合にのみ関連します。したがって、ここでの 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 に答える