了解领域驱动设计

时间:2010-06-11 05:05:17

标签: dns repository domain-driven-design repository-pattern

我几个星期以来一直在努力了解DDD。它非常令人困惑。我不明白我是如何组织我的项目的。我对UnitOfWork,Repository,Associations有很多疑问,而且这个列表继续......

让我们举一个简单的例子。

Album and Tracks

Album: AlbumId, Name, ListOf Tracks
Tracks: TrackId, Name
  1. 我应该在专辑中将Tracks公开为IList / IEnumerabe属性吗?如果我如何添加相册?或者我应该公开Tracks的ReadOnlyCollection并公开AddTrack方法吗?

  2. 如何为相册加载曲目[假设延迟加载]?如果getter检查为null,然后使用存储库加载轨道(如果需要的话)?

  3. 我们如何组织程序集。就像每个组件有什么一样? Model.dll - 它只有域实体吗?存储库在哪里?接口和实现都。我可以在Model.dll中定义IAlbumRepository吗? Infrastructure.dll:这应该是什么?

  4. 工作单位在哪里定义?存储库和工作单元如何通信?或者他们应该?例如。如果我需要在专辑中添加多个曲目,那么这应该在Album上定义为AddTrack还是存储库中有一个方法? 无论方法在哪里,我如何在这里实施工作单元?

  5. UI应该使用Infrastructure..dll还是应该有ServiceLayer?

  6. 我的问题有意义吗?

    此致

1 个答案:

答案 0 :(得分: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使用。

编写添加和删除曲目到相册的方法。在这些方法中,您可以添加其他逻辑。