1. 程式人生 > >ABP+AdminLTE+Bootstrap Table許可權管理系統第三節--abp分層體系,實體相關及ABP模組系統

ABP+AdminLTE+Bootstrap Table許可權管理系統第三節--abp分層體系,實體相關及ABP模組系統

ABP模組系統 

說了這麼久,還沒有詳細說到abp框架,abp其實基於DDD(領域驅動設計)原則的細看分層如下:

再看我們專案解決方案如下:

JCmsErp.Application,應用層:進行展現層與領域層之間的協調,協調業務物件來執行特定的應用程式的任務。它不包含業務邏輯,主要包含一些模型,abp重要的資料傳輸DTO,包括資料庫對映實體,前端檢視模型轉實體(Entity)物件,一個應用服務方法通常被認為是一個工作單元(Unit of Work),使用一種像AutoMapper這樣的工具來進行實體與DTO之間的對映,前端引數傳入有限性驗證等等

JCmsErp.Core:領域層:領域層就是業務層,是一個專案的核心,所有業務規則都應該在領域層實現。包括業務物件和業務規則,這是應用程式的核心層。 

實體(Entity):實體代表業務領域的資料和操作,在實踐中,通過用來對映成資料庫表。

倉儲(Repository):倉儲用來操作資料庫進行資料存取。倉儲介面在領域層定義,而倉儲的實現類應該寫在基礎設施層。

領域服務(Domain service):當處理的業務規則跨越兩個(及以上)實體時,應該寫在領域服務方法裡面。

領域事件(Domain Event): 在領域層某些特定情況發生時可以觸發領域事件,並且在相應地方捕獲並處理它們。 

工作單元(Unit of Work)工作單元是一種設計模式,用於維護一個由已經被修改(如增加、刪除和更新等)的業務物件組成的列表。它負責協調這些業務物件的持久化工作及併發問題。

JCmsErp.EntityFramework:基礎設施層:提供通用技術來支援更高的層。例如基礎設施層的倉儲(Repository)可通過ORM來實現資料庫互動。當在領域層中為定義了倉儲介面,應該在基礎設施層中實現這些介面。可以使用ORM工具,例如EntityFramework或NHibernate。ABP的基類已經提供了對這兩種ORM工具的支援。還有資料遷移等。

JCmsErp.Web:展現層:提供試圖用於與使用者實現互動操作.

JCmsErp.WebApi:這裡在abp中主要是提供介面,可以是解決方案內部使用介面,可以是與移動端等其他埠連線的介面.

二,實體(Entity)

實體是DDD(領域驅動設計)的核心概念之一。Eirc Evans是這樣描述的實體的:“它根本上不是通過屬性定義的,而是通過一系列連續性和標識定義的”。因此,實體都有Id屬性並且都儲存到資料庫中。一個實體一般會對映到資料庫的一張表

abp中實體是派生於Entity類,先看一下我們在Core層新建的Users類

Users實體類,有人說這個實體為什麼沒有id,因為Users繼承自Entity類,Entity類已經定義id,

它是該Entity類的 主鍵。因此,所有實體的主鍵名都是相同的,都是Id

Id(主鍵)的型別是可以改變的,預設是int(int32)的。如果你想將Id定義為其他型別,可以在<>內寫,比如Guid,long也是可以的。

Entity類重寫了等號運算子(==),可以輕鬆地檢查兩個實體是否相同了(實體的Id相同則認為它們相同)。它也定義了IsTransient方法來檢測它是否有Id。

 

審計:

IHasCreationTime使得使用一個通用的屬性來描述一個實體的“建立時間”資訊成為可能。當實現了該介面的實體類插入到資料庫中時,ABP會自動地將當前的時間設定給CreationTime。

ICreationAudited增加了CreatorUserId擴充套件了IHasCreationTime,當用戶儲存一個新的實體的時候,會自動把當前的id設定為CreatorUserId,還有類似的LastModificationTime也是一樣。

當更新實體時,abp會自動為你設定這些屬性。

軟刪除

軟刪除是將一個實體標記為已刪除的通常使用的模式,而不是直接從資料庫中刪除。比如,你可能不想從資料庫中硬刪除一個User,因為它可能關聯其他的表

ABP實現了開箱即用的軟刪除模式。當一個軟刪除實體被刪除後,ABP檢測到之後,會阻止刪除,將IsDeleted設定為true並更新資料庫中的實體。而且,它會自動地過濾資料庫中軟刪除的實體,不會檢索(select)它們。

如果使用了軟刪除,那麼你可能想儲存一些資訊,比如何時刪除以及誰刪除了一個實體等等

 

在JCmsErp.Application建立一個Users資料夾,然後建立UserinfoDto,DTO是用於Core和 Web間的資料傳輸物件.有了實體了為什麼還要DTO呢

1,DTO保證了層與層的分離,web層改變不影響core層,core做改變也不影響web.

2,資料保護,不然敏感或者不需要的資料暴露於web層,不被別人窺見如密碼,銀行賬號,身份證等敏感資訊

3,序列化,序列化集合,但是子集不序列化,當首次用到子集的時候才序列化.

4,惰性載入

5,DTO資料驗證

6,abp還有一些擴充套件的介面,擴充套件性好,降低耦合度,使表現層和邏輯層之間耦合度降低.

這裡Serializable就是支援序列化的標籤,   [AutoMapFrom(typeof(Users))]是指和Users之間雙向自動轉化的標籤,並不需要每個欄位都去手動匹配.ABP提供了若干特性和擴充套件方法來定義對映。首先,要將Abp.AutoMapper nuget包新增到專案中。然後,AutoMap特性是雙向對映方式, AutoMapFrom和 AutoMapTo是單向對映方式。最後,使用MapTo擴充套件方法將一個物件對映到另一個物件

ABP模組系統簡介

ABP框架提供了建立和組裝模組的基礎,一個模組能夠依賴於另一個模組。在通常情況下,一個程式集就可以看成是一個模組。在ABP框架中,一個模組通過一個類來定義,而這個類要繼承自AbpModule。

模組系統當前專注於服務端而不是客戶端。


如果學習過Orchard的朋友,應該知道module模組的強大了。模組的本質就是可重用性,你可以在任意的地方去呼叫,而且通過實現模組,你寫的模組也可以給別人用。.net可以通過反射獲取一個程式集中的類以及方法。

1.3.2 定義模組

Assembly程式集:Assembly是一個用來包含程式的名稱,版本號,自我描述,檔案關聯關係和檔案位置等資訊的一個集合。最簡單的理解就是:一個你自己寫的類庫生成的dll就可以看做是一個程式集,這個程式集可以包括很多類,類又包括很多方法等。

一個派生自 AbpModule 的類就是模組的定義。我們正在開發一個部落格模組,該模組可以被使用在不同的應用程式中。最簡單的模組定義示例如下:

public class MyBlogApplicationModule : AbpModule //定義
{
    public override void Initialize() //初始化
    {
        IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
        //這行程式碼的寫法基本上是不變的。它的作用是把當前程式集的特定類或介面註冊到依賴注入容器中。
    }
}

如果需要的話,模組類負責類的依賴注入(通常可以像上面一樣做)。我們能配置應用程式和其它模組,新增新的功能到應用程式等等。

1.3.3 方法的生命週期

在一個應用中,ABP框架呼叫了Module模組的一些指定的方法來進行啟動和關閉模組的操作。我們可以過載這些方法來完成我們自己的任務。

ABP框架通過依賴關係的順序來呼叫這些方法,假如:模組A依賴於模組B,那麼模組B要在模組A之前初始化,模組啟動的方法順序如下:

  1. PreInitialize-B
  • PreInitialize-A
  • Initialize-B
  • Initialize-A
  • PostInitialize-B
  • PostInitialize-A

下面是具體方法的說明:

PreInitialize

預初始化:當應用啟動後,第一次執行會先呼叫這個方法。在初始化(Initialize)方法呼叫之前,該方法通常是用來配置框架以及其它模組。

在依賴注入註冊之前,你可以在這個方法中指定你需要注入的自定義啟動類。例如:加入你建立了某個符合約定的註冊類,你應該使用 IocManager.AddConventionalRegisterer 方法在這裡註冊它。

Initialize

初始化:在這個方法中一般是來進行依賴注入的註冊,一般我們通過IocManager.RegisterAssemblyByConvention這個方法來實現。如果你想實現自定義的依賴注入,那麼請參考依賴注入的相關文件。

PostInitialize

提交初始化:最後一個方法,這個方法用來解析依賴關係。

Shutdown

關閉:當應用關閉以後,這個方法被呼叫。

1.3.4 模組依賴

Abp框架會自動解析模組之間的依賴關係,但是我們還是建議你通過過載GetDependencies方法來明確的宣告依賴關係。

[DependsOn(typeof(MyBlogCoreModule))]//通過註解來定義依賴關係
public class MyBlogApplicationModule : AbpModule
{
    public override void Initialize()
    {
        IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
    }
}

例如上面的程式碼,我們就聲明瞭MyBlogApplicationModule和MyBlogCoreModule的依賴關係,MyBlogApplicationModule這個應用模組依賴於MyBlogCoreModule核心模組,並且,MyBlogCoreModule核心模組會在MyBlogApplicationModule模組之前進行初始化。

ABP可以從 startup module 遞迴的解析依賴關係,並按需初始化它們。最後初始化的模組是啟動模組(startup module)。

1.3.5 外掛模組

當模組從啟動模組以及其依賴關係進行調查發現的時候,ABP也能夠動態的載入其它指定模組。AbpBootstrapper 類定義了 PlugInSources 屬性,我們能用該屬性新增需要動態載入的模組。外掛源可以是任何實現了 IPlugInSource 介面的類。FolderPlugInSource 類實現了該介面,它可以被用來載入指定資料夾下的程式集。

ASP.NET Core

ABP的ASP.NET Core模組也可以動態載入模組,你只需要在 Startup 類中使用已定義的擴充套件方法 AddAbp,如下所示:

services.AddAbp<MyStartupModule>(options =>
{
    options.PlugInSources.Add(new FolderPlugInSource(@"C:\MyPlugIns"));
});

我們可以使用擴充套件方法 AddFolder 更方便的實現上述功能:

services.AddAbp<MyStartupModule>(options =>
{
    options.PlugInSources.AddFolder(@"C:\MyPlugIns");
});

瞭解更多關於Startup類的資訊,請檢視 ASP.NET 文件

ASP.NET MVC,Web API

對於經典的ASP.NET MVC應用,我們可以在 global.asax 重寫 Application_Start 方法來新增外掛資料夾,如下所示:

public class MvcApplication : AbpWebApplication<MyStartupModule>
{
    protected override void Application_Start(object sender, EventArgs e)
    {
        AbpBootstrapper.PlugInSources.AddFolder(@"C:\MyPlugIns");
        //...
        base.Application_Start(sender, e);
    }
}

外掛中的控制器

如果你的模組包括了MVC或者Web API控制器,ASP.NET不能發現這些控制器。為了克服這個問題,你可以在 global.asax 中新增程式碼來實現,如下所示:

using System.Web;
using Abp.PlugIns;
using Abp.Web;
using MyDemoApp.Web;

[assembly: PreApplicationStartMethod(typeof(PreStarter), "Start")]

namespace MyDemoApp.Web
{
    public class MvcApplication : AbpWebApplication<MyStartupModule>
    {
    }

    public static class PreStarter
    {
        public static void Start()
        {
            //...
            MvcApplication.AbpBootstrapper.PlugInSources.AddFolder(@"C:\MyPlugIns\");
            MvcApplication.AbpBootstrapper.PlugInSources.AddToBuildManager();
        }
    }
}

Additional Assemblies

對於IAssemblyFinder和ITypeFinder的預設實現(這兩個介面的實現被ABP用來在應用程式中發現指定的類)僅僅只用來查詢模組程式集以及在這些程式集中所使用的型別。我們可以在我們的模組中重寫 GetAdditionalAssemblies 方法來包含附加程式集。

1.3.6 自定義的模組方法

我們自己定義的模組中可能有方法被其他依賴於當前模組的模組呼叫,下面的例子,假設模組2依賴於模組1,並且想在預初始化的時候呼叫模組1的方法。這樣,就把模組1注入到了模組2,因此,模組2就能呼叫模組1的方法了。

譯者注:
ABP的模組系統與Orchard的模組有類似之處,但還是有比較大的差別。Orchard的框架修改了ASP.NET程式集的預設載入方式(模組的DLL沒有放在Bin資料夾下,是放在WEB專案根資料夾下面的Modules資料夾下),實現了功能模組的熱插拔,而ABP的模組程式集還是放在Bin資料夾下的,沒有實現熱插拔。

public class MyModule1 : AbpModule
{
    public override void Initialize() //初始化模組
    {
        IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());//這裡,進行依賴注入的註冊。
    }

    public void MyModuleMethod1()
    {
        //這裡寫自定義的方法。
    }
}

[DependsOn(typeof(MyModule1))]
public class MyModule2 : AbpModule
{
    private readonly MyModule1 _myModule1;

    public MyModule2(MyModule1 myModule1)
    {
        _myModule1 = myModule1;
    }

    public override void PreInitialize()
    {
        _myModule1.MyModuleMethod1(); //呼叫MyModuleMethod1的方法。
    }

    public override void Initialize()
    {
            IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
     }
}

在這裡,我們通過建構函式注入MyModule1到MyModule2,所以MyModule2能夠呼叫MyModule1的自定義方法。當且僅當MyModule2依賴於MyModule1才是可能的。

1.3.7 模組配置

雖然自定義模組可以被用來配置模組,但是,作者建議使用啟動配置來定義和配置模組。

1.3.8 模組生命週期

所有的模組類都被自動的註冊為單例模式。

相關推薦

ABP+AdminLTE+Bootstrap Table許可權管理系統十一節--Bootstrap Table使用者管理列表以及Module Zero之使用者管理

   使用者實體       使用者實體代表應用的一個使用者,它派生自AbpUser類,如下所示: public class User : AbpUser<Tenant, User> { //add your own user properties here

ABP+AdminLTE+Bootstrap Table許可權管理系統九節--AdminLTE引入模板頁和佈局和選單

 AdminLTE    首先去官網下載包下來,然後引入專案.   然後我們在web層新增區域Admin以及Common,關於AdminLTE的地址我們放在Common路勁下面.   在Common下新增LayoutController控制器. Layout 這裡選單我們先不管,在後

ABP+AdminLTE+Bootstrap Table許可權管理系統四節--倉儲,服務,服務介面依賴注入

AbpModule      在ABP框架中,倉儲,服務,這塊算是最為重要一塊之一了.ABP框架提供了建立和組裝模組的基礎,一個模組能夠依賴於另一個模組,一個程式集可看成一個模組, 一個模組可以通過一個類來定義這個模組,而給定義這個類要繼承自已經瘋轉好的AbpModule..net通過反射來獲取這些程

ABP+AdminLTE+Bootstrap Table許可權管理系統七節--登入邏輯幾種abp封裝的Javascript函式庫

        簡介        經過前幾節,我們已經解決資料庫,模型,DTO,控制器和注入等問題.那麼再來看一下登入邏輯.這裡算是前面幾節的一個初次試水. 首先我們資料庫已經有的相應的資料. 新增Login方法        模型和DTO已經建好,所以我們直接在服務層新增Login方法就可

ABP+AdminLTE+Bootstrap Table許可權管理系統三節--abp分層體系,實體相關ABP模組系統

ABP模組系統  說了這麼久,還沒有詳細說到abp框架,abp其實基於DDD(領域驅動設計)原則的細看分層如下: 再看我們專案解決方案如下: JCmsErp.Application,應用層:進行展現層與領域層之間的協調,協調業務物件來執行特定的應用程式的任務。它不包含業務邏輯,主要包

ABP+AdminLTE+Bootstrap Table許可權管理系統十節--AdminLTE模板選單處理

 AdminLTE選單       上節我們把佈局頁,也有的臨時的選單,但是選單不是應該動態載入的麼?,所以我們這節來寫選單.首先我們看一下AdminLTE原始碼裡面的選單以及結構. <aside class="main-sidebar"> <!--

ABP+AdminLTE+Bootstrap Table許可權管理系統八節--ABP錯誤機制AbpSession相關

((ClaimsPrincipal)Thread.CurrentPrincipal).Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier);        需要獲取會話資訊則必須實現IAbpSession介面。雖然你

ABP+AdminLTE+Bootstrap Table許可權管理系統六節--abp控制器擴充套件json封裝

 一,控制器AbpController    說完了Swagger ui 我們再來說一下abp對控制器的處理和json的封裝.    首先我們定義一個控制器,在新增控制器的時候,控制器會自動繼承自AbpController,AbpController

ABP+AdminLTE+Bootstrap Table許可權管理系統第一節--使用ASP.NET Boilerplate模板建立解決方案

ABP+AdminLTE+Bootstrap Table許可權管理系統一期 Github:https://github.com/Jimmey-Jiang/ABP-ASP.NET-Boilerplate-Project-CMS 前往部落格園總目錄

ABP+AdminLTE+Bootstrap Table許可權管理系統一期

 初衷    學而時習之,不亦說乎,溫顧溫知新,可以為師矣.           看懂遠不如動手去做,動手做才能發現很多自己不懂的問題,不斷的反思和總結,“樂於分享是一種境界的突破”。" 分享是很有意思,也是可以鍛鍊人的。 分享意味著自我的不斷淨化提升,不給自己後退的餘地。為什麼這麼說呢?因為:一,分

ABP+AdminLTE+Bootstrap Table許可權管理系統第二節--在ABP的基礎做資料庫指令碼處理

      第一點,上一篇文章中我們講到codefirst中一些問題包括如圖,codefirst在每次執行命令的時候會生成新的類,後來會越來越多。 1,codefirst在執行的資料庫遷移過程中產生了很多檔案,對於強迫症的我而言特別不爽,這些其實是可以不用生成的。 2,在codefirst實際

ABP module-zero +AdminLTE+Bootstrap Table+jQuery許可權管理系統十四節--後臺工作者HangFire與ABP框架Abp.Hangfire擴充套件

HangFire與Quartz.NET相比主要是HangFire的內建提供整合化的控制檯,方便後臺檢視及監控,對於大家來說,比較方便。 HangFire是什麼 Hangfire是一個開源框架(.NET任務排程框架),可以幫助您建立,處理和管理您的後臺作業,處理你不希望放入請求處理管道的操作: 通知/通訊;

ABP module-zero +AdminLTE+Bootstrap Table+jQuery許可權管理系統十七節--Quartz與ABP框架Abp.Quartz擴充套件

Quartz簡介 Quartz.NET是一個開源的作業排程框架,是 OpenSymphony 的 Quartz API 的.NET移植,它用C#寫成,可用於winform和asp.net應用中。它提供了巨大的靈活性而不犧牲簡單性。你能夠用它來為執行一個作業而建立簡單的或複雜的排程。它有很多特徵,如:資料庫支

ABP module-zero +AdminLTE+Bootstrap Table+jQuery許可權管理系統十六節--SignalR與ABP框架Abp.Web.SignalR擴充套件

SignalR簡介 SignalR是什麼? ASP.NET SignalR 是為 ASP.NET 開發人員提供的一個庫,可以簡化開發人員將實時 Web 功能新增到應用程式的過程。實時 Web 功能是指這樣一種功能:當所連線的客戶端變得可用時伺服器程式碼可以立即向其推送內容,而不是讓伺服器等待客戶端請求新的資

ABP module-zero +AdminLTE+Bootstrap Table+jQuery許可權管理系統十二節--小結,Bootstrap Table之角色管理以及module-zero角色管理

寫在前面的話           很多人說ABP不適合高併發大型,有一定的道理,但是我覺得還是可以的,就看架構師的能力了,我之前公司就是ABP絕對百萬資料級專案,是一個線上教育網站,涉及到平臺,學院,院系,班級,課程,學生等,一個平臺多少大學,一個大學多少院系,一個院系多少班級多少課程,其負責程度一

ABP module-zero +AdminLTE+Bootstrap Table+jQuery許可權管理系統三節--RBAC模式ABP許可權管理(附贈福利)

角色訪問控制(RBAC) 角色訪問控制(RBAC)應該是目前用得最多也是關注最多的許可權管理模型了。 許可權(Permission)與角色(Role)相關聯,使用者(User)通過成為適當角色的成員而得到這些角色的許可權。這就極大地簡化了許可權的管理。 RBAC引入了角色(Role)概念,目的應該是解耦了P

ABP module-zero +AdminLTE+Bootstrap Table+jQuery許可權管理系統十五節--快取小結與ABP框架專案中 Redis Cache的實現

快取 為什麼要用快取 為什麼要用快取呢,說快取之前先說使用快取的優點。 減少寄宿伺服器的往返呼叫(round-trips)。 如果快取在客戶端或是代理,將減少對伺服器的請求,減少頻寬。 減少對資料庫伺服器的往返呼叫(round-trips)。 當內容快取在web伺服器,能夠減輕對資料庫的請求。 減少網路

ABP module-zero +AdminLTE+Bootstrap Table+jQuery權限管理系統十二節--小結,Bootstrap Table之角色管理

增刪 習慣 etc 根據 很好 這不 update 必須 virtual 返回總目錄:ABP+AdminLTE+Bootstrap Table權限管理系統一期 很多人說ABP不適合高並發大型,有一定的道理,但是我覺得還是可以的,就看架構師的能

整合springboot+mvc+mybatis(通用mapper)+druid+jsp+bootstrap實現許可權管理檔案上傳下載多資料來源切換操作日誌記錄等功能

花了兩週,學習了下springboot,然後做個小東西練練手.專案基於jdk1.8+maven整合了springboot+mvc+mybatis(通用mapper)+druid+jsp+bootstrap等技術,springboot+Listener(監聽器),Filter

深入理解計算機系統----四章處理器體系結構

https://www.jianshu.com/p/15210eb3870d?open_source=weibo_search 原文地址 目錄 學習事物是怎樣工作的有其內在價值:處理器是如何工作的對於我們普通人來說一直是個祕密,我們將從零開始構建一個流水線處理器,為了實現這一處理器的軟