ABP之什麼是ABP(ASP.NET Boilerplate)

1.介紹

ABP是開源的且文檔比較齊全的應用程序框架。其實它不單單是個框架,考慮其最佳實踐,ABP更提供了基於領域驅動設計(DDD)的強大價格模型。web

ABP支持最新的ASP.NET Core和EF Core,同時也支持ASP.NET MVC 5.x和EF 6.x.瀏覽器

2.快速看一個示例

public class TaskAppService : ApplicationService, ITaskAppService
{
    private readonly IRepository<Task> _taskRepository;

    public TaskAppService(IRepository<Task> taskRepository)
    {
        _taskRepository = taskRepository;
    }

    [AbpAuthorize(MyPermissions.UpdateTasks)]
    public async Task UpdateTask(UpdateTaskInput input)
    {
        Logger.Info("Updating a task for input: " + input);

        var task = await _taskRepository.FirstOrDefaultAsync(input.TaskId);
        if (task == null)
        {
            throw new UserFriendlyException(L("CouldNotFindTheTaskMessage"));
        }

        input.MapTo(task);
    }
}

上面是一個Application Service 方法示例,DDD中方的Application Service直接由表示層調用來執行應用程序的用例。app

將UpdateTask當作是JavaScript經過AJAX調用的方法。框架

3.ABP的優點

依賴注入(DI):ABP提供了傳統的DI基礎設施,因爲此類是應用程序服務,所以它一般在DI容器中註冊爲瞬態(根據請求建立). 它能夠簡單地注入任何依賴項(例如此示例中的IRepository <Task>)。async

倉儲:ABP能夠爲每一個實體建立一個默認存儲庫(例如本例中的IRepository <Task>)。 默認存儲庫有許多有用的方法,例如本例中使用的FirstOrDefault方法。 咱們能夠擴展默認存儲庫以知足咱們的需求。 倉儲庫抽象了DBMS和ORM並簡化數據訪問邏輯。spa

受權:ABP能夠聲明性的檢查權限,若是當前用戶沒有「update tasks」權限或者未登陸,ABP會阻止訪問UpdateTask方法。ABP不只使用聲明性屬性,並且還有其餘一些受權方法。設計

驗證:ABP會自動檢查輸入是否爲Null,它還基於標準數據註釋屬性和自定義驗證規則驗證輸入的全部屬性。若是請求無效,則會拋出異常並在客戶端進行處理。代理

審計日誌:根據約定和配置,爲每一個請求自動保存用戶,瀏覽器,IP地址,調用服務,方法,參數,調用時間,執行時長以及其餘一些信息。日誌

工做單元:在ABP,每一個應用程序服務方法默認都被假設成一個工做單元。它自動的在方法開始時建立一個鏈接並開始一個事務。若是這個方法沒有任何異常的完成,事務會被提交而且釋放鏈接。儘管這個方法用了不一樣的倉儲或者方法,他們都將是原子的(事務的)。當一個事務被提交的時候,對實體的全部修改將會自動被保存。咱們甚至不須要調用_repository.Update(task),如上例所示。code

異常處理:在一個ABP的web應用程序中,咱們幾乎歷來不用手動去處理異常.默認狀況下全部的異常都會被自動處理!若是一個異常發生,ABP會自動記錄並向客戶端返回正確的結果。好比,若是這是一個AJAX請求,它返回一個JSON對象到客戶端標識一個錯誤的發生。只有在UserFriendlyException狀況下,它會隱藏真實的異常。它還能夠處理客戶端上的錯誤,並向用戶展現相應的信息。

日誌:咱們能夠使用在基類中定義的Logger對象。默認使用Log4Net,可是這個是可更改可配置的。

本地化:注意咱們在拋出異常時使用了'L'方法? 這樣,它會根據當前用戶的文化自動進行本地化。

自動映射:在最後一行中,咱們使用ABP的MapTo擴展方法將輸入屬性映射到實體屬性。 它使用AutoMapper庫來執行映射。 咱們能夠根據命名約定輕鬆地將屬性從一個對象映射到另外一個對象。

動態的API:TaskAppService是一個簡單的類。 一般咱們必須編寫一個包裝器API控制器來向JavaScript客戶端公開方法,但ABP會在運行時自動執行該操做。 這樣,咱們能夠直接從客戶端使用應用程序服務方法。

動態AJAX代理:ABP建立代理方法,這些方法使調用應用程序服務方法就像在客戶端上調用JavaScript方法同樣簡單。

咱們能夠在這個簡單的類中看到ABP的好處。 全部這些任務一般須要花費很長時間,但在ABP中,框架都幫咱們作了。咱們只須要關注本身真正的業務。

相關文章
相關標籤/搜索