第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

創(chuàng)建聚合根及其子對(duì)象(實(shí)體)的正確流程是什么?

創(chuàng)建聚合根及其子對(duì)象(實(shí)體)的正確流程是什么?

PHP
嗶嗶one 2022-10-28 16:26:30
我正在將我的數(shù)據(jù)驅(qū)動(dòng)設(shè)計(jì)重構(gòu)為領(lǐng)域驅(qū)動(dòng),我對(duì)代碼的結(jié)構(gòu)有幾個(gè)問題我有一個(gè)User entitynamespace Planner\Domain\Entities;class UserEntity {    private $userId;    private $weight;    private $height;    public function __construct(int $id, float $weight, float $height){        $this->userId = $id;        ...    }}我還有一個(gè)Settings entity應(yīng)該與用戶對(duì)象創(chuàng)建一起創(chuàng)建的。namespace Planner\Domain\Entities;class SettingsEntity {    private $id;    private $userId;    private $darkTheme;    public function __construct(int $id, int $userId, bool $darkTheme){        $this->id = $id;        $this->userId = $userId;        $this->darkTheme = $darkTheme;    }}Settings 對(duì)象不能沒有 User 存在,因此 settingsEntity 應(yīng)該由 User 實(shí)體管理。這意味著,用戶實(shí)體不僅僅是一個(gè)實(shí)體,它應(yīng)該是一個(gè)聚合根。目前,當(dāng)用戶點(diǎn)擊“創(chuàng)建賬戶”時(shí),App 向 發(fā)出 API 請(qǐng)求example.com/user/save,控制器動(dòng)作將請(qǐng)求對(duì)象發(fā)送到Planner\Application\Services\UserServicesave 方法。namespace Planner\Application\Services;use Planner\Domain\Entities\UserEntity;use Planner\Domain\Entities\SettingsEntity;use Planner\Domain\Repositories\UserRepository;use Planner\Application\Services\SettingsService;class UserService {    public function __construct(UserRepository $repo, SettingsService $settings){        $this->userRepository = $repo;        $this->settingsService = $settings;    }    public function save($request){        $user = new UserEntity(...);        $settings = new SettingsEntity(...);        if(!$this->userRepository->save($user) || !$this->settingsRepository->save($settings)){            throw new UserCreationFailedException();        }    }}問題是,我不知道是否應(yīng)該一次性創(chuàng)建用戶實(shí)體和設(shè)置實(shí)體(從理論上講,因?yàn)槲覜]有用戶聚合根,只有一個(gè)用戶實(shí)體)用戶聚合根或者當(dāng)前方式有效。我還有其他需要同時(shí)創(chuàng)建的實(shí)體...與設(shè)置對(duì)象相同,我只是將它們添加到ifUserService 保存方法中的檢查中(上面的代碼)還是應(yīng)該全部在用戶聚合下,例如:namespace Planner\Domain;class User extends AggragateRoot {    public function __construct(UserRepository $repository){        $this->repository = $repository;    }    public function createAccount($request){        $user = new UserEntity(...$request);        $settings = new SettingsEntity(...$user);        $this->repository->save($user, $settings);    }}
查看完整描述

2 回答

?
MYYA

TA貢獻(xiàn)1868條經(jīng)驗(yàn) 獲得超4個(gè)贊

所有頂級(jí)實(shí)體都是聚合根。在您當(dāng)前的設(shè)計(jì)中,UserEntitySettingsEntity是有效的聚合根 (AR)。AR 是事務(wù)性和一致性邊界。AR 的作用是確保與它們封裝的數(shù)據(jù)相關(guān)的不變量永遠(yuǎn)不會(huì)被破壞,即使通過并發(fā)也是如此。

AR 應(yīng)該設(shè)計(jì)得盡可能小,因?yàn)樗鼈兛梢苑乐箤?duì)它們保護(hù)的數(shù)據(jù)進(jìn)行并發(fā)修改。為了從 AR 模式中受益,您必須努力將 AR 視為事務(wù)邊界,因此對(duì)于大多數(shù)用例(可能存在例外),嘗試只修改每個(gè)事務(wù)的單個(gè) AR。但是,該規(guī)則在創(chuàng)建 AR 時(shí)并不適用,因?yàn)樵趧?chuàng)建時(shí)并發(fā)沖突不應(yīng)該是常見的。

這里有兩種顯而易見的潛在設(shè)計(jì),正確的一種取決于實(shí)際的業(yè)務(wù)不變量和您想要做出的妥協(xié)。

  1. User并且Settings具有交叉不變量,這意味著不變量User可能取決于狀態(tài),Settings反之亦然。在這種情況下User,并且Settings必須是同一一致性邊界的一部分。您很可能擁有UserAR 和Settings生活在User.

  2. User并且Settings可以獨(dú)立進(jìn)化(除了他們的創(chuàng)造)。在這種情況下,您很可能希望將UserSettings作為自己獨(dú)立的 AR,但在同一個(gè)事務(wù)中創(chuàng)建兩者(或不創(chuàng)建 - 最終一致性)。請(qǐng)注意,在 AR 上使用工廠方法來創(chuàng)建另一個(gè)工廠方法通常很優(yōu)雅。

    transaction {
         user = new User(…)
         settings = user.initSettings(...)
         userRepository.save(user);
         settingsRepository.save(settings);}

    從那時(shí)起,UserSettings在不同的事務(wù)中進(jìn)行修改。

PS:我建議刪除諸如“實(shí)體”之類的技術(shù)前綴。語言是 DDD 的關(guān)鍵,我懷疑領(lǐng)域?qū)<以谒麄兊恼Z言中使用“UserEntity”(甚至可能不是“User”)或“SettingsEntity”這個(gè)詞。


查看完整回答
反對(duì) 回復(fù) 2022-10-28
?
溫溫醬

TA貢獻(xiàn)1752條經(jīng)驗(yàn) 獲得超4個(gè)贊

這取決于它是否是新用戶。

如果它是現(xiàn)有用戶,則處理它的一種方法是使用存儲(chǔ)庫“水合”用戶和存儲(chǔ)中的設(shè)置。然后修改。

如果是新用戶,您可以使用工廠實(shí)例化聚合根(用戶實(shí)體)并使用符合 UL 的工廠方法從輸入生成設(shè)置。

擁有用戶對(duì)象后,將其發(fā)送到存儲(chǔ)庫以進(jìn)行持久化。


查看完整回答
反對(duì) 回復(fù) 2022-10-28
  • 2 回答
  • 0 關(guān)注
  • 210 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)