abp入門系列目錄——學習abp框架之實操演練原始碼路徑:github-learningmpaabp自上次更新有乙個多月了,發現越往下寫,越不知如何去寫。特別是當遇到ddd中一些概念術語的時候,尤其迷惑。如果只是簡單的去介紹如何去使用abp,我只需參照官方文件,實現到任務清單demo中去就可以了,不勞神不費力。但是,這樣就等於一知半解。
知之為知之,不知為不知,是知也。知其然知其所以然,方能舉一反三嘛。
後續的文章我會繼續保持之前的書寫風格,並適當穿插一些對ddd中的概念的理解,來加深對abp框架的學習。
使用者可以無限建立任務但僅能分配給自己;管理員具有分配任務給他人的許可權,任務分配成功後要通知接收人。我們分析下這個業務用例,其實主要涉及到乙個業務操作——任務分配。按照我們傳統的思路,在做任務分配這個操作時,就是對任務進行編輯,沒有什麼特別的地方,通過**呼叫應用層服務更新task實體即可。
public void updatetask(updatetaskinput input)
); }
}}以上**也能滿足以上需求,但是這已經違背了abp分層架構的思想,其實也就是違背了ddd的思想。
應用層不包含業務邏輯,而我們的updatetask
方法明顯承載了太多的業務,既要檢查許可權又要傳送通知。
那可如何是好?自然是在領域服務去處理這些業務邏輯了。
這裡就引入了ddd中的兩個概念,應用服務和領域服務,我們有必要先來介紹一下,之後再來用領域服務來改造。
應用服務對應的是應用層,領域服務對應的領域層。它們之間主要的區別在於是否處理業務邏輯。那這個限制從何而來呢?ddd的分層架構思想。
應用服務作為領域服務的消費方,領域服務是無狀態的(領域物件具有狀態和行為,而領域服務是用來處理業務邏輯的,它本身是乙個行為,所以是無狀態的)。領域服務是用來協調領域物件完成某個操作,狀態由領域物件儲存。
上面也說了,領域物件是具有狀態和行為的。那就是說我們也可以在實體或值物件來處理業務邏輯。那我們該如何取捨呢?
一般來說,在下面的幾種情況下,我們可以使用領域服務:
執行某個具體的業務操作。
領域物件的轉換。
以多個領域物件為輸入,返回乙個值物件。
經過上面的分析,很顯然我們的用例,使用領域服務來實現更合適。
abp中定義了idomainservice
介面,按約定所有的領域服務都要實現它,實現之後,領域服務被自動暫時的註冊到依賴注入系統。
同樣,領域服務也可以從domainservice
類繼承,因此它可以使用繼承得來的日誌、本地化、等屬性。
這裡,我們定義乙個itaskmanager
(abp中約定俗成的領域服務命名規則,以manager結尾,當然你也可以自行命名)來定義我們的領域服務,然後實現它。
namespace learningmpaabp.tasks
}
實現的領域服務負責主要的業務邏輯,其中傳送通知的業務我定義了乙個領域事件去實現。關於領域事件,我們下節再聊。
namespace learningmpaabp.tasks
public void assigntasktoperson(task task, user user)
if (task.state != taskstate.open)
//獲取是否有【分配任務給他人】的許可權
bool canassigntasktoother = _permissionchecker.isgranted(permissionnames.pages_tasks_assignperson);
if (user.id != _abpsession.getuserid() && !canassigntasktoother)
task.assignedpersonid = user.id;
//使用領域事件觸發傳送通知操作
_eventbus.trigger(new taskassignedeventdata(task, user));}}
}
定義完領域服務,我們直接在應用服務層呼叫即可。
public void updatetask(updatetaskinput input)
); }
}
更新後updatetask
方法已經注釋掉了許可權檢查以及發布通知的業務邏輯,整個方法也講更清晰。
這一節沒有太難的知識點,我們只需謹記,領域服務和應用服務的區別在於只有領域服務才處理業務邏輯。應用服務作為領域服務的消費方,是很薄的一層。
當然,我們也要記住,過度使用領域服務會導致貧血領域模型(即所有的業務邏輯都位於領域服務中,而不是實體和值物件中)。
ABP入門系列(2) 領域層建立實體
abp入門系列目錄 學習abp框架之實操演練 這一節我們主要和領域層打交道。首先我們要對abp的體系結構以及從模板建立的解決方案進行一一對應。網上有 生成器去簡化我們這一步的任務,但是不建議初學者去使用。領域層就是業務層,是乙個專案的核心,所有業務規則都應該在領域層實現。實體 entity 實體代表...
ABP官方文件 十八 領域服務
領域服務 或者服務,在ddd模式中 是被用來執行領域操作或者業務規則的。eric evans 在他的ddd書中這樣說過 乙個好的service應該有以下三個特徵 與領域概念相關的操作不是entity或value object 的乙個自然部分 介面是根據領域模型的其它元素定義的 操作是無狀態的。領域服...
ABP官方文件翻譯 3 4 領域服務
領域服務 一些 介紹 領域服務 或者在ddd中單純的服務 用來執行領域操作和業務規則。eric evans在他的ddd書中描述了乙個好的服務有三個特徵 1.與領域概念關聯的操作,但不是實體或值物件的自然組成部分。2.介面的定義依照領域模型的其他元素。3.操作是無狀態的。不像應用服務那樣獲取或返回dt...