2010-03-21 627 views
1

我是設計和EMR。我確定該域的中心對象是Patient。患者必須具有以下「Doctor」和「醫療記錄」。病歷是一個組術語指的遭遇,實驗室,X光,處方集體....DDD和實體和值對象之間的區別。選擇聚合根目錄

我是新來DDD和我有一對夫婦的概念和我的DDD的理解麻煩。以下代碼示例顯示Encounter類。 Encounter包含幾個propertiees,它也引用另一個類Vitals

VitalsPatient以外沒有任何意義。我仍然用自己的密鑰來識別數據庫中的生命體徵。我不確定這是否符合Vitals作爲一個實體。目前我有Vitals作爲價值對象。

其次,我的模型建立的方式,我有Encounter定義爲Aggregate根。通過Encounter,醫生可以訂購實驗室,X射線和開藥。基本上Encounter記錄了這些物品被訂購的原因。

存在一個問題,即我還需要在Encounter的上下文之外檢索這些項目,那麼這是否意味着Encounter不是聚合根。諸如Vitals之類的項目就是一個值對象。

這是我的代碼...

public class Encounter { 
    String ChiefComplaint {get; set;} 
    string Plan {get; set;} 
    string Assessment {get; set;} 
    Vital PatientVital {get; set;} 
} 

public class Vital { 
    public float Temperature { get; private set; } 
    public BloodPressure BP { get; private set; } 
    public int Pulse { get; private set; } 
    public int Respiratory { get; private set; } 

    internal Vital(float temperature, int systolic, int diastolic, int pulse, int respiratory) { 
     this.Temperature = temperature; 
     BloodPressure bp = new BloodPressure(); 
     bp.Systolic = systolic; 
     bp.Diastolic = diastolic; 
     this.Respiratory = respiratory; 
     this.BP = bp; 
    } 

    public void AddBP(int systolic, int diastolic) { 
     BloodPressure bp = new BloodPressure(); 
     bp.Systolic = systolic; 
     bp.Diastolic = diastolic; 
     this.BP = bp; 
    } 
} 

public struct BloodPressure { 
    public BloodPressure(int systolic, int diastolic){ 
     Systolic = systolic; 
     Diastolic = diastolic; 
    } 

    public int Systolic { get; private set; } 
    public int Diastolic { get; private set; } 

    public string bloodPressure { 
     get { return this.Systolic.ToString() + "/" + this.Diastolic.ToString(); } 
    } 
} 

回答

1

我並不完全相信你的實際問題。缺乏問號會讓人有點難以理解 - 但我會盡力迴應似乎是個問題。

醫療記錄,醫生和患者都是可能在某些方面聚集根:它們都存在於現實世界中,甚至可以觸摸它們,並且它們每個都聚合其他物體或信息。但是,您可能不需要將對象建模爲實際成爲聚合根的程度 - 這取決於您的應用程序的確切要求。

但是,這些實體不會相互聚合。醫生可以無病歷存在,患者也可以存在。遺憾的是,醫療記錄需要患者醫生,所以他們不能被任何一個人聚合。因此,他們成爲一個實體。

前面提到的每一個都必須有自己的身份。請注意,即使這些對象的相關項目沒有,這些對象也會繼續存在最明顯的是,即使病人沒有,醫生仍留在系統中,但更重要的是,這些文件也存在(並且可能使患者和醫生不被刪除,但這是另一個問題)。

我還是找出命脈在數據庫中有自己的鑰匙

畢竟,你需要存儲生命體徵爲每一個病人的名單。由於您可能使用的是SQL,因此您可能需要使用鏈接器表對此m:n關係進行建模,因此您必須指定一個鍵。那沒問題。這是持久層的一個缺點,而不是模型的缺點,但是除了內部應用程序之外,你應該確保永遠不要使用這個鍵。

therfore意思相逢是不是一個聚合根

的「邂逅」肯定不是一個聚合根相對於醫生或患者:這是又一個M:N的關係,之間的時間醫生和病人,所以很明顯,每個病人和每個醫生會遇到很多病人。如果其中一次遭遇被刪除(例如,因爲它們不正確),這不會刪除病人或醫生。此外,Encounter不是處方的聚合根源:例如,X射線本身就非常合理。但是,您可能想保留一個參考。同樣,將來刪除Encounter將不會恢復X射線。

遭遇者不擁有醫生或患者。醫生'自己'也不會遇到。

另外請注意,遇到可能導致藥物處方,或可能不會導致任何事情。

注意您的方法AddBP()將有效地刪除舊的值,所以它不應該被命名爲'添加'。更重要的是,這種方法使Vital類可變,因此更復雜。我會擺脫那種方法。

+0

我對缺乏明確的問題表示歉意。我明白,病人和醫生會成爲根。確實,醫生爲給定患者創建醫療記錄,因此這是否意味着在患者背景之外檢索醫療記錄是沒有意義的。同樣在處方的情況下,如果存在針對每個處方的商業規則,那麼必須有有效的相遇,那麼相遇只是成爲處方的屬性 – William 2010-03-21 18:37:21