Application Services Application Services are used to expose domain logic to the presentation layer. An Application Service is called from the present ...
Application Services
Application Services are used to expose domain logic to the presentation layer. An Application Service is called from the presentation layer using a DTO (Data Transfer Object) as a parameter. It also uses domain objects to perform some specific business logic and returns a DTO back to the presentation layer. Thus, the presentation layer is completely isolated from Domain layer.
Application Services用於將域邏輯公開給表示層。使用DTO(數據傳輸對象)作為參數從表示層調用應用服務。它還使用域對象來執行某些特定的業務邏輯,並將DTO返回給表示層。因此,表示層與域層完全隔離。
在理想的分層應用程式中,表示層永遠不會直接使用域對象。
IApplicationService:
空介面,起到標識作用。所有實現了IApplicationService 的類都會被自動註入到容器中。所有IApplicationService對象都會被註入一些攔截器(例如:auditing, UnitOfWork等)以實現AOP
ApplicationService:
作為所有其他appservice的基類。其封裝了對AbpSession, Permission和Feature這些模塊的功能調用.
IAsyncCrudAppService 和 AsyncCrudAppService
ICrudAppService 和 CrudAppService
一個是介面 一個是介面的實現,字面上就可以猜測出意思,大概就是自動實現了 非同步增刪改查,同步增刪改查。也就是說 我們的介面繼承自它們 就可以實現增刪改查
官方給的解釋:
If you need to create an application service that will have Create, Update, Delete, Get, GetAll methods for a specific entity,
you can easily inherit from the CrudAppService class. You could also use the AsyncCrudAppService class to create async methods. The CrudAppService base class is generic, which gets the related Entity and DTO types as generic arguments. This is also extensible, allowing you to override functionality when you need to customize it.
如果需要創建具有Create,Update,Delete,Get,GetAll方法的應用程式服務,則可以輕鬆地從CrudAppService類繼承。您還可以使用AsyncCrudAppService類來創建非同步方法。CrudAppService基類是通用的,它將相關的Entity和 DTO類型作為泛型參數。這也是可擴展的,允許您在需要自定義時覆蓋功能。
此時:TestAppService 就具有 Create, Update, Delete, Get, GetAll 等方法了。
public class TestAppService : AsyncCrudAppService<Test, TestDto>
{
public TaskAppService(IRepository<Task> repository)
: base(repository)
{
}
}
同時,ABP還會自動為我們創建控制器,因為在Web.Core的Module的PreInitialize方法中,有這樣一段方法,自動會為實現了 ApplicationService 的創建控制器,所以運行項目swagger上有xxxxservice 不用驚訝
Configuration.Modules.AbpAspNetCore()
.CreateControllersForAppServices(
typeof(BlogApplicationModule).GetAssembly()
);
但是我們的TestAppService 明明實現的是 AsyncCrudAppService ,追過去看繼承鏈就知道了,最後還是繼承自ApplicationService
public abstract class CrudAppServiceBase<TEntity, TEntityDto, TPrimaryKey, TGetAllInput, TCreateInput, TUpdateInput> : ApplicationService
where TEntity : class, IEntity<TPrimaryKey>
where TEntityDto : IEntityDto<TPrimaryKey>
where TUpdateInput : IEntityDto<TPrimaryKey>
CRUD Permissions
如果想要對C R U D 方法 增加許可權的話,可以這樣寫。
public class TestAppService : AsyncCrudAppService<Test, TestDto>
{
public TaskAppService(IRepository<Task> repository)
: base(repository)
{
CreatePermissionName = "Your Permission Name";
}
}
其中 CreatePermissionName 是 CrudAppServiceBase(AsyncCrudAppService是它子類) 中定義的,其中還有 UpdatePermissionName DeletePermissionName GetAllPermissionName GetPermissionName
授權
上面說到了,許可權問題,那麼怎麼創建許可權呢?
很簡單
在我們的項目中,xxx.core 也就是領域層下有個文件夾,Authorization, 文件夾下有個 xxxAuthorizationProvider.cs 的類文件
打開 可以看的
public class BlogAuthorizationProvider : AuthorizationProvider
{
public override void SetPermissions(IPermissionDefinitionContext context)
{
context.CreatePermission(PermissionNames.Pages_Users, L("Users"));
context.CreatePermission(PermissionNames.Pages_Roles, L("Roles"));
context.CreatePermission(PermissionNames.Pages_Tenants, L("Tenants"), multiTenancySides: MultiTenancySides.Host);
context.CreatePermission(PermissionNames.Article_Create, L("ArticleCreate"));//這個是我自己添加的許可權。
//第一個參數 是我們程式里需要的許可權名稱
//第一個參數 是Display name 也就是我們後臺系統里看到的名字
}
private static ILocalizableString L(string name)
{
return new LocalizableString(name, BlogConsts.LocalizationSourceName);
}
}
PermissionNames是什麼呢?
public static class PermissionNames
{
public const string Pages_Tenants = "Pages.Tenants";
public const string Pages_Users = "Pages.Users";
public const string Pages_Roles = "Pages.Roles";
public const string Article_Create = "Article.Create";
}
其實 就是個靜態類,裡面定義了許多常量 也就是我們許可權的名稱
如果我們想使用的話,有以下四個屬性:
- 在Application 層中,我們使用 Abp.Authorization.AbpAuthorize屬性。
- 在MVC控制器(Web層)中,我們使用 Abp.Web.Mvc.Authorization.AbpMvcAuthorize屬性。
- 在ASP.NET Web API中,我們使用 Abp.WebApi.Authorization.AbpApiAuthorize屬性。
- 在ASP.NET Core中,我們使用 Abp.AspNetCore.Mvc.Authorization.AbpMvcAuthorize屬性。
[AbpAuthorize("your permissions")]