天天看點

ABP架構 - 介紹

原文: ABP架構 - 介紹 文檔目錄 本節内容:

我們總是對不同的需求開發不同的應用。但至少在某些層面上,一次又一次地重複實作通用的和類似的功能。如:授權,驗證,異常處理,日志,本地化,資料庫連接配接管理,設定管理,稽核日志等功能。是以我們建立架構和最佳實踐,如分層和子產品架構,DDD,依賴注入等,并嘗試開發應用時基于一些約定。

由于所有這些是非常耗時而且很難單獨建立并可适用于每個項目,許多公司建立自己的架構,他們用自己的架構能快速開發新應用而且不出錯。但不是所有的公司都是幸運的,大部分公司沒有時間,預算和團隊來開發好的架構。他們甚至都沒有可能建立一個架構,因為編寫文檔,教育訓練開發人員和維護架構都是非常困難的。

ASP.NET Boilerplate (ABP) 是一個開源并且有豐富文檔的應用架構,開發宗旨是:“為所有公司,所有開發人員,開發出一個通用架構!”,而且不隻是一個架構,同時提供一個強大的基于DDD的構架模型和最佳實踐。

讓我們從一個簡單的類來體會一下ABP帶來的便利:

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

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

    [AbpAuthorize(MyPermissions.UpdatingTasks)]
    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("CouldNotFoundTheTaskMessage"));
        }

        Input.MapTo(task);
    }
}      

示例裡我們看到一個

應用服務

方法,在DDD中,應用服務方法是在表示層執行應用的使用者用例的。我們可以想成UpdateTask方法是被Ajax調用。讓我們看看ABP帶來的便利:

  • 依賴注入 :ABP使用并提供一個強大而且符合約定的DI架構。上述的應用服務,按照約定臨時的(每個請求Request建立一個)注冊到DI容器,它能簡單地注入所有依賴項(如示例中的Irepository<Task>)。
  • 倉儲 :ABP能為每個實體建立一個預設的倉儲(如示例中的Irepository<Task>)。預設倉儲包含許多有用的方法,如示例中的FirstOrDefault方法。我們可以根據需要,很容易地擴充預設倉儲。倉儲抽象了DBMS和ORM以及簡化了資料通路邏輯。
  • 授權 :ABP可以檢查許可。如果目前使用者沒有“updating task”權限或是未登入,ABP就會阻止他們通路UpdateTask方法。用陳述性的特性來簡化授權,當然還有另外的授權方式。
  • 驗證 :ABP自動檢查input是否為null。根據标準的資料注釋特性和自定義驗證規則,檢查一個input的所有屬性。如果請求沒有通過驗證,會抛出一個對應的驗證異常。
  • 審計日志 :根據約定和配置,每個請求的使用者、浏覽器、Ip位址、調用服務、方法、參數、調用時間、執行耗時和其它的一些資訊會被自動地儲存下來。
  • 工作單元 :在ABP裡,每個應用服務方法都預設地被認定為一個工作單元。在方法開始前,它自動建立一個連接配接并開啟一個事務。如果方法成功完成,接着事務會被送出并釋放連接配接。即使是使用不同的倉儲或是方法,它們都可以是原子性(事務性)的,并且當事務送出時實體中所有的修改都自動地被儲存。是以,如同示例所示,我們甚至不需要去調用_repository.Update(task)方法。
  • 異常處理 :我們幾乎不用在一個使用ABP的Web應用中寫異常處理。所有的異常都自動地被預設處理。當一個異常發生,ABP自動記錄它并傳回一個對應的結果給用戶端。例如,一個AJAX請求,它會傳回一個Json對象給用戶端,告知發生了一個錯誤。如示例所示,UserFriendlyException可以向用戶端隐藏具體的異常,顯示友好資訊。它同樣可以在用戶端了解并處理用戶端錯誤,并向使用者顯示對應的資訊。
  • 日志 :如你所見,我們可以用定義在基類中的Logger對象寫日志。預設使用Log4Net,不過這是可修改和可配置的。
  • 本地化 :請注意我們在抛出異常時,使用了L方法。是以,它可自動依據使用者區域,使用相應的本地化資訊。當然,我們需要在某處定義CouldNotFoundTheTaskMessage(更多資訊參見“ ”文檔)。
  • 自動映射 :最後一行代碼,我們使用ABP的MapTo擴充方法來映射input屬性到實體屬性。它使用AutoMapper庫來執行映射。是以,我們可以簡單地基于命名約定,從一個對象映射到另一個。
  • 動态Web API 層 :實際上TaskAppService是一個簡單的類(甚至是不需要從ApplicationService繼承)。我們通常包裝一個Web API 控制器為Javascript用戶端公開方法,ABP會在運作時自動地完成這件事。是以,我們可以直接在用戶端使用應用服務。
  • 動态Javascript AJAX 代理 :ABP建立Javascript代理方法,以便就本地調用一樣,來調用應用服務。

通過這麼一個簡單類我們能看到ABP的便利。完成這些任務一般來說都是很費時的,但是所有的一切,ABP都自動處理了。

除了示例所示,ABP提供了一個強大的基礎架構和應用模型,下列為ABP的其它特性:

  • 子產品化 :提供一個強大的基礎架構來建立可重用的子產品。
  • 資料過濾 :提供自動地資料過濾來實作一些模式,像軟删除和多租戶。
  • 多租戶 :完全地支援多租戶,包含單資料庫或每租戶一個單獨資料庫。
  • 設定管理 :提供一個基礎架構來讀取/修改應用、租戶和使用者級别的設定。
  • 單元和內建測試:以可測試為宗旨,當然提供基礎類來簡化單元測試和內建測試。 點選檢視更多相關資訊

檢視

文檔

了解所有功能。

開始一個新的解決方案、建立層、安裝nuget包、建立一個簡單的布局和菜單...所有這些都是耗時的工作。

ABP提供預建立的

,使開始一個新的解決方案更簡單。模闆支援SPA(單頁面應用)和MPA(多頁面MVC應用)結構。同時允許我們使用不同的ORM工具。

ABP開源項目在

Github

上,分發在

Nuget

上。“

”是使用ABP的最簡單方式(按

所述操作)。

kid1412附:

英文原文:http://www.aspnetboilerplate.com/Pages/Documents/Introduction