前言
源碼地址:
https://github.com/SkylerSkr/Skr3D
領(lǐng)域是DDD的核心要點。在領(lǐng)域?qū)勇阌埃覀儜?yīng)該處理掉該領(lǐng)域的全部業(yè)務(wù)。在這里我們只需要操作領(lǐng)域?qū)ο蟆?br>
領(lǐng)域?qū)ο笕绾纬志没I(lǐng)域?qū)ο笤趺达@示到UI層,這些都不是領(lǐng)域?qū)涌紤]的事情洁墙。
我們以電商項目為例,先對電商進(jìn)行建模戒财。
領(lǐng)域?qū)嶓w:
領(lǐng)域?qū)嶓w就是將領(lǐng)域中遇到的對象進(jìn)行建模热监,以實體的方式表達(dá)出來。
例如:在電商項目中饮寞,主訂單下孝扛,有多個子訂單和收獲地址。
public class Order : Entity
{
protected Order()
{
}
public Order(Guid id, string name,Address address, List<OrderItem> orderItem)
{
Id = id;
Name = name;
Address = address;
OrderItem = orderItem;
}
/// <summary>
/// 訂單名
/// </summary>
public string Name { get; private set; }
/// <summary>
/// 收獲地址
/// </summary>
public Address Address { get; private set; }
/// <summary>
/// 訂單詳情
/// </summary>
public virtual ICollection<OrderItem> OrderItem { get; private set; }
}
public class OrderItem : Entity
{
/// <summary>
/// 詳情名
/// </summary>
public string Name { get; private set; }
public virtual Order Order { get; set; }
}
/// <summary>
/// 地址
/// </summary>
//[Owned]
public class Address : ValueObject<Address>
{
/// <summary>
/// 省份
/// </summary>
public string Province { get; private set; }
/// <summary>
/// 城市
/// </summary>
public string City { get; private set; }
/// <summary>
/// 區(qū)縣
/// </summary>
public string County { get; private set; }
/// <summary>
/// 街道
/// </summary>
public string Street { get; private set; }
public Address() { }
public Address(string province, string city,
string county, string street)
{
this.Province = province;
this.City = city;
this.County = county;
this.Street = street;
}
}
從這3個實體類中幽崩,我們得出以下定義疗琉。
聚合根:Order,根實體歉铝,在領(lǐng)域中的最小單位,子節(jié)點有普通的領(lǐng)域?qū)嶓w和值類型凑耻。
普通的領(lǐng)域?qū)嶓w:OrderItem太示,有獨立的標(biāo)識。
值類型:Address香浩,類似地址這種不需要標(biāo)識的數(shù)據(jù)类缤,是一個不可更改的值。比如我在某寶買了東西邻吭,地址寫了上海餐弱,然后去用戶模塊把自己收獲地址改成北京,但是訂單的地址應(yīng)該是根據(jù)下單時候填寫的才對囱晴。
領(lǐng)域?qū)ο蟮腃RUD:
我們前面也說了膏蚓,在領(lǐng)域?qū)永镏惶幚眍I(lǐng)域內(nèi)的事情。將領(lǐng)域?qū)ο筮M(jìn)行建模得到實體畸写,讓我們可以用程序操作領(lǐng)域?qū)ο笸郧啤5俏覀內(nèi)绾潍@取領(lǐng)域?qū)ο螅⑵涑志没@都不需要我們關(guān)心枯芬。我們只需在領(lǐng)域?qū)勇暶髁顺志没涌诼郾剩尰A(chǔ)設(shè)施層去實現(xiàn)它。
/// <summary>
/// 定義泛型倉儲接口千所,并繼承IDisposable狂魔,顯式釋放資源
/// </summary>
/// <typeparam name="TEntity"></typeparam>
public interface IRepository<TEntity> : IDisposable where TEntity : class
{
/// <summary>
/// 添加
/// </summary>
/// <param name="obj"></param>
void Add(TEntity obj);
/// <summary>
/// 根據(jù)id獲取對象
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
TEntity GetById(Guid id);
/// <summary>
/// 獲取列表
/// </summary>
/// <returns></returns>
IQueryable<TEntity> GetAll();
/// <summary>
/// 根據(jù)對象進(jìn)行更新
/// </summary>
/// <param name="obj"></param>
void Update(TEntity obj);
/// <summary>
/// 根據(jù)id刪除
/// </summary>
/// <param name="id"></param>
void Remove(Guid id);
/// <summary>
/// 保存
/// </summary>
/// <returns></returns>
int SaveChanges();
}
/// <summary>
/// IOrderRepository接口
/// 注意,這里我們的對象淫痰,是領(lǐng)域?qū)ο? /// </summary>
public interface IOrderRepository : IRepository<Order>
{
//一些Student獨有的接口
Order GetByName(string name);
}
領(lǐng)域?qū)ο笕绾纬志没綌?shù)據(jù)庫最楷,這是基礎(chǔ)設(shè)施層要解決的問題。
我們只需要定義好對領(lǐng)域?qū)ο蟛僮鞯某志没涌诩纯伞?br>
PS:持久化接口操作的是領(lǐng)域?qū)ο?/strong>。