1 回答

TA貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超8個(gè)贊
我認(rèn)為您問(wèn)題的答案首先取決于另一個(gè)問(wèn)題:
這些狀態(tài)在您的領(lǐng)域中有多重要?
這里重要的是在設(shè)計(jì)中考慮領(lǐng)域文獻(xiàn)(又名無(wú)處不在的語(yǔ)言)。但實(shí)施細(xì)節(jié)實(shí)際上取決于問(wèn)題的重要性。他們甚至可以是獨(dú)立的實(shí)體!
entity.To(new ApprovedState());
如果狀態(tài)轉(zhuǎn)換只是一個(gè)標(biāo)志數(shù)據(jù),那么您在此處提供的第一個(gè)實(shí)現(xiàn)可能就足夠了,但如果它更重要并且有更多的業(yè)務(wù)規(guī)則圍繞它,您可以使用第二個(gè)實(shí)現(xiàn),或者像 State 或 Strategy 這樣的模式。
interface IState{...}
class Approved : IState {...}
class Requested : IState {...}
class Entity{
public IState State {get; set;}
}
最后你可以提供一層薄薄的 fluent API 來(lái)更精細(xì)地表達(dá)你的領(lǐng)域(當(dāng)然你也可以這樣設(shè)計(jì)......):
TheEntity.IfItsPossible().Approve();
更新
這里還有一件事。有時(shí)我們向?qū)嶓w添加字段,就像我們對(duì)數(shù)據(jù)庫(kù)中的表執(zhí)行相同操作一樣。這就是數(shù)據(jù)庫(kù)世界的工作方式!但我認(rèn)為這在 DDD 中完全不同。也許這些不同的狀態(tài)實(shí)際上扮演著不同實(shí)體的角色或隱藏的業(yè)務(wù)規(guī)則,需要深入挖掘。假設(shè)Request不是 Reload 實(shí)體的狀態(tài),而是人們?cè)谛枰?Reload 時(shí)創(chuàng)建的實(shí)體。就像您在需要購(gòu)買產(chǎn)品時(shí)創(chuàng)建訂單一樣。
public class Reload
{
}
public class Request
{
public string User { get; set; }
public DateTime Time { get; set; }
// and other logics about requests
}
public interface IFactory
{
Reload Create(Request request);
}
如果這真的是域中發(fā)生的事情,那么這些狀態(tài)只不過(guò)是其他實(shí)體和域服務(wù)的內(nèi)部工作的結(jié)果。例如,標(biāo)準(zhǔn)化狀態(tài)就是我們所說(shuō)的在隊(duì)列中等待處理的重新加載,您可以從應(yīng)用程序的模塊中查詢這些信息:
public interface IQueueService
{
void Push(Reload reload);
}
public IEnumerable<Reload> GetStandardizedReloads()
{
return _queueService.Items();
}
public IEnumerable<Request> GetRequests()
{
return _requestRepository.GetAll();
}
- 1 回答
- 0 關(guān)注
- 316 瀏覽
添加回答
舉報(bào)