Entity中是否可以引用Repository

windflaw發表於2007-04-23
DDD裡講的Repository用於對一個entity的重建,因此Repository依賴於entity是很正常的一個關係。但是在使用中,會遇到entity本身需要訪問資料庫,如果呼叫repository來訪問的話,變成了雙向依賴,感覺不好。

例如:一個entity叫排班表,它下面對應每一天的班次安排。它們間算是一個聚合體吧。可以寫成這樣:
public class WorkShiftSchedule // 排班表
{
public IList DayArrangeList; // 每日的班次安排列表。
}
public class DayArrange // 每日排班明細
{
public WorkShiftSchedule OwnerSchedule; // 所屬的排班表
public DateTime Day; // 日期
public WorkShift WorkShiftPlan; // 安排的班次
}

但是,幾年下來,明細資訊越來越多,顯然用IList這樣的資料集就算用Lazy Load效能會出現很大問題。為了查某一週的排班資訊,卻要載入好幾年的排班明細,顯然不合理。DDD裡提到了,如果資料集不合適,可以選用查詢。想想也合乎業務需要,因為從使用者角度,不需要載入所有明細,只需要某天,或某個月內的排班情況。於是我改成了:
public class WorkShiftSchedule
{
public IList GetMonthArranges(string month){}
public DayArrange GetDayArrange(DateTime day){}
}

我的問題也因此產生了,GetMonthArranges需要查詢,那麼是否寫成:
public IList GetMonthArranges(string month)
{
return WorkShiftScheduleRepository.QueryDayArranges(this, month);
}

public class WorkShiftScheduleRepository
{
public static IList QueryDayArranges(WorkShiftSchedule schedule, string month){}
}


但一直覺得這樣似乎變成了Repository和Entity之間雙向依賴,容易造成混亂。但依DDD裡說的,DayArrange又是從屬於WorkShiftSchedule這個根的,所以一切訪問要透過WorkShiftSchedule。不然直在外部用Repository來查詢就好了,不經過WorkShiftSchedule。一直疑慮,還望前輩們指點迷津。

[該貼被windflaw於2007年04月23日 21:15修改過]

相關文章