2010-06-11 105 views
1

我一直試圖瞭解DDD幾個星期了。它非常混亂。我不明白我如何組織我的項目。我有很多關於UnitOfWork,Repository,Associations的問題,並且這個列表繼續...瞭解領域驅動設計

讓我們舉一個簡單的例子。

Album and Tracks 

Album: AlbumId, Name, ListOf Tracks 
Tracks: TrackId, Name 
  1. 我應該暴露曲目作爲專輯一的IList/IEnumerabe財產?如果那我該如何添加一張專輯?或者我應該公開一個ReadOnlyCollection的軌道並公開一個AddTrack方法?

  2. 如何加載專輯曲目[假設延遲加載]?應該吸氣劑檢查爲空,然後使用存儲庫加載軌道,如果需要的話?

  3. 我們如何組織組件。像每個組件有什麼? Model.dll - 它只有域實體嗎?存儲庫在哪裏?接口和實現兩者。我可以在Model.dll中定義IAlbumRepository嗎? Infrastructure.dll:這有什麼用?

  4. 定義的工作單元在哪裏?知識庫和工作單元如何溝通?或者他們應該?例如。如果我需要將多首曲目添加到專輯中,應該再次將其定義爲專輯的AddTrack或應該在存儲庫中有一個方法? 無論方法在哪裏,我如何在這裏實現工作單元?

  5. UI應該使用Infrastructure.dll還是應該有ServiceLayer?

我的問題有道理嗎?

問候

+1

重要的是要記住,DDD主要是關於無處不在的語言,一種使用客戶和程序員都可以理解的術語與客戶進行交流的方式。該計劃的設計是次要的,但重要的考慮因素。拿起Eric Evans關於DDD的書可能是值得的。 – 2010-06-11 05:14:34

+1

只是想提及,它是我的寵物使用程序集來組織代碼,這是命名空間的用途。程序集適用於需要在多個項目之間共享代碼的情況,但不一定要將所有內容都納入其中。通過將archetecture圖層拆分爲單獨的dll,您所做的全部工作都是編譯時間更長,應用程序加載時間更長。 – 2010-06-11 05:14:42

+1

InfoQ提供了一本關於DDD的入門書,它是Eric Evans書中的一部分:http://www.infoq.com/minibooks/domain-driven-design-quickly – APC 2010-06-11 05:52:47

回答

0

問題1,我建議的結構是這樣的:

public class Album 
{ 
    public int AlbumId { get; set; } 

    /// <summary> 
    /// Readonly, foreach, public 
    /// </summary> 
    public IEnumerable<Track> Tracks 
    { 
     get { return TrackList; } 
    } 

    /// <summary> 
    /// Protected for repository/ORM 
    /// </summary> 
    protected IList<Track> TrackList { get; set; } 

    public void AddTrack(Track track) 
    { 
     //Here you can put additional logic 
     TrackList.Add(track); 
    } 

    public void RemoveTrack(Track track) 
    { 
     //Here you can put additional logic 
     TrackList.Remove(track); 
    } 
} 
public class Track 
{ 

} 

寫公共IEnumerable的屬性軌道允許只讀訪問和週期。

受保護的屬性包含軌道,可以由ORM使用。

寫入方法添加和刪除曲目專輯。在這些方法中,您可以添加其他邏輯。