我几个星期以来一直在努力了解DDD。它非常令人困惑。我不明白我是如何组织我的项目的。我对UnitOfWork,Repository,Associations有很多疑问,而且这个列表继续......
让我们举一个简单的例子。
Album and Tracks
Album: AlbumId, Name, ListOf Tracks
Tracks: TrackId, Name
我应该在专辑中将Tracks公开为IList / IEnumerabe属性吗?如果我如何添加相册?或者我应该公开Tracks的ReadOnlyCollection并公开AddTrack方法吗?
如何为相册加载曲目[假设延迟加载]?如果getter检查为null,然后使用存储库加载轨道(如果需要的话)?
我们如何组织程序集。就像每个组件有什么一样? Model.dll - 它只有域实体吗?存储库在哪里?接口和实现都。我可以在Model.dll中定义IAlbumRepository吗? Infrastructure.dll:这应该是什么?
工作单位在哪里定义?存储库和工作单元如何通信?或者他们应该?例如。如果我需要在专辑中添加多个曲目,那么这应该在Album上定义为AddTrack还是存储库中有一个方法? 无论方法在哪里,我如何在这里实施工作单元?
UI应该使用Infrastructure..dll还是应该有ServiceLayer?
我的问题有意义吗?
此致
答案 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使用。
编写添加和删除曲目到相册的方法。在这些方法中,您可以添加其他逻辑。