2013-10-15 82 views
0

對不起,如果這是一個愚蠢的問題,但我似乎無法控制。NHibernate繼承從父類創建子對象

我有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; 
    } 
} 

我敢肯定,這必須是一個繼承,其中各會員客戶,雖然如果我絕望,我可以訴諸構圖。

請注意,在這裏我使用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的警告我,在構造函數中,這點我同意,避免訪問虛擬成員,並告訴我,使會員不能有虛擬成員密封類(無NHibernate的兼容性)。

當有一天我向Customer類添加了一個新屬性時,它也引發了另一個問題,我忘了對Member構造函數做同樣的事情。

2 - 使用某種反射助手來映射兩個對象。

確定這是一個可行的選擇,但我目前瞭解DDD,我想知道是否可以將這樣的助手放在域圖層中?

需要一些建議,謝謝!

+0

你想做什麼?我不完全明白你的問題。 「註冊」是什麼意思? (這不是OOP常用的術語......) –

+0

@ThomasWeller抱歉不清楚。最接近的含義是從現有的Customer(父)對象創建一個新的Member(child)對象,並將所有現有的父屬性複製到子節點 –

+0

@ThomasWeller編輯了這個問題,謝謝你的領導:) –

回答

1

不確定我是否能幫到您,但是您的Member課程中無需執行任何與Customer相關的任何操作。你只需要告訴NHibernate成員派生自Customer,並且你需要爲這兩個類提供正確的映射。就這樣,剩下的就會自動完成(無論如何,這就是OOP的全部繼承點)。

關於你的第二個問題('不要在c'tor中調用虛擬機'):這在理論上是正確的,但只有在虛擬方法在派生類中被覆蓋的機會纔有意義。所以你可以放心地忽略這裏的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(); 
+0

嗯..不知道我得到它..你能給我一個例子如何「投」客戶成員? –

+0

編輯答案。這更接近你要找的東西嗎? –

+0

呃..不是真的,這很像我的第一個選擇,當我想向Customer添加一個新屬性時出現這個問題。這只是一個想我可以想到的。 –