2015-03-19 40 views
0

在介紹了域驅動設計之後,我意識到DDD專注於業務模型,而不是任何特定的框架/語言/技術。作爲一個數據驅動的心態持有者(x),我正在努力確定在我們的真實項目中實施DDD的步驟。我想知道現實世界DDD實施中的實際步驟是什麼。例如:在實際項目中執行DDD的步驟

  1. 第一識別業務領域模型
  2. 相關每個用例,用戶故事,業務需求模型
  3. 發展與規定的框架解決方案爲DDD

或(?)別的東西?

回答

1

域驅動設計鼓勵增量開發,而不是瀑布式開發。 DDD是關於對複雜領域的理解,它不能一次完全發現。我建議經常重複你給出的步驟。

另一件事是用例和業務需求與領域模型高度耦合。真的很難分開創建它們。

+0

嗨Mequrel,謝謝你的迴應。作爲新來者,我陷入了DDD理論。從堆棧溢出中的少數帖子中,我瞭解到ddd只適用於非常複雜的項目。我並不完全同意它。如果定義了一些明確的步驟,以便每個特殊的新手都得到一些指導線。 – mnhmilu 2015-03-23 03:45:06

3

我通常在開始時做的是識別域的所有實體。

例如,我們來看看典型的博客方法。

我們可以擁有這個實體,用戶,帖子和管理員。

有時候,首先不能識別所有這些數據,因此我不會先獲得分析paralisys我首先處理代碼。

對我而言,下一步自然就是確定這些實體之間如何協作。寫帖子的用戶是誰?然後,讓我們向它的代碼:

$user->create(new Post($title, $body)); 

那麼也許管理員需要審查後接受它,並顯示在頁面:

$admin->reviewPostFrom($user); 

正如你看到的,我們儘量使代碼儘可能自然,這就是想法,能夠向領域專家解釋代碼。

接下來的事情是通過定義用例,我們可以創建應用程序需要的操作。

我們可以用命令的方式,例如:

class CreateNewPost 
{ 
    protected $userId; 
    protected $postTitle; 
    protected $postBody; 

    public function __construct(UserId $idUser, PostTitle $postTitle, PostBody $postBody) 
    { 
     // Here we can make some kind of validation of the data 
    } 
} 

而且接下來我們將命令發送到我們的命令總線,誰將會是RESPONSABLE處理此命令。它是命令處理程序,所有的使用情況下發生:

class CreateNewPostHandler 
{ 
    // here we inject all dependencies we need to accomplish our use case 
    public function __construct(UserRepositoryInterface $userRepo, etc..) 
    { 
     $this->userRepository = $userRepo; 
     etc... 
    } 

    public function handle(CreateNewPost $command) 
    { 
     $user = $userRepo->getById($command->userId); 
     $user->create(new Post($command->getTitle(), $command->getBody())); 

     // Maybe we can launch an event here that launches a notification to admin, etc. 
     $this->eventDispatcher(new PostCreatedEvent($user)); 
    } 
} 

正如你所看到的,我們沒有想到很多事情,雖然我們的編碼我們意識到我們需要的。我希望它是你的利益!