ABP入門系列(18) 使用領域服務

2022-01-09 22:53:15 字數 2419 閱讀 5922

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...