ABP框架—後臺:應用服務ApplicationServices(9)

預立科技發表於2019-08-06

       應用服務作用是將領域(業務)邏輯暴露給外部(vue前臺等)。外部(vue前臺等)通過傳入DTO(資料傳輸物件)引數來呼叫應用服務,而應用服務通過領域物件來執行相應的業務邏輯並且將DTO返回。因此,外部(vue前臺等)和領域層將被完全隔離開來。在一個理想的層級專案中,外部(vue前臺等)應該從不直接訪問領域物件。

此部分內容未使用DTO,後續文章會繼續講解

此應用服務層在ABP框架中會生成swagger中介面,供外部(vue前臺)呼叫,這樣就可以將專案中前後端分離

一、應用服務呼叫預設倉儲

當ABP框架內預設的倉儲能夠滿足需要時,則直接呼叫即可
示例:https://blog.csdn.net/sinat_16998945/article/details/97374091  檢視內容(一、預設倉儲)


應用服務呼叫預設倉儲時,只需要編寫服務介面實現類就行, 直接繼承應用服務基類PDAppServiceBase、直接實現預設應用服務介面類IApplicationService

using System.Collections.Generic;
using System.Threading.Tasks;
using Abp.Application.Services;
using Abp.Domain.Repositories;

namespace PD.Menu
{
    public class MenuAppService : PDAppServiceBase,IApplicationService
    {
        private readonly IRepository<Sys_Menu> _Sys_MenuRepository;

        public MenuAppService(IRepository<Sys_Menu> Sys_MenuRepository)
        {
            _Sys_MenuRepository = Sys_MenuRepository;
        }

        public async Task<List<Sys_Menu>> Get()
        {
            //GetAllListAsync  是自動預設倉儲中方法
            return await _Sys_MenuRepository.GetAllListAsync();
        }
    }
}


二、呼叫自定義倉儲

當ABP框架內預設的倉儲不能夠滿足需要時,則需要在預設倉儲上進行擴充套件方法
示例:https://blog.csdn.net/sinat_16998945/article/details/97374091  檢視內容(二、自定義倉儲)

應用服務呼叫自定義倉儲時,需要編寫服務介面和服務介面實現類,如圖

1.服務介面類需要繼承IApplicationService

using Abp.Application.Services;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace PD.Menu
{
    public interface IMenuAppService : IApplicationService
    {
        Task<List<Sys_Menu>> GetMenu();
    }
}

2.服務介面實現類需要繼承PDAppServiceBase、且實現上面的服務介面類    

using System.Collections.Generic;
using System.Threading.Tasks;
using PD.Menu.Repository;

namespace PD.Menu
{
    public class MenuAppService : PDAppServiceBase, IMenuAppService
    {

        private readonly IMenuRepository _menuManager;

        public MenuAppService(IMenuRepository menuManager)
        {
            _menuManager = menuManager;
        }

        public async Task<List<Sys_Menu>> GetMenu()
        {
            //GetSys_MenuList是自定義倉儲的方法
            var query = await _menuManager.GetSys_MenuList();
            //TODO  其他相關操作 
            return query;
        }
    }
}

三、呼叫多個倉儲

當實際需求中,單個倉儲不滿足,也可以呼叫多個倉儲

using System.Collections.Generic;
using System.Threading.Tasks;
using PD.Menu.Repository;
using PD.Roles;

namespace PD.Menu
{
    public class MenuAppService : PDAppServiceBase, IMenuAppService
    {

        private readonly IMenuRepository _menuManager;

        private readonly IRoleAppService _roleAppService;

        public MenuAppService(IMenuRepository menuManager,IRoleAppService roleAppService)
        {
            _menuManager = menuManager;
            _roleAppService = roleAppService;
        }

        public async Task<List<Sys_Menu>> GetMenu()
        {
            //GetSys_MenuList是自定義倉儲的方法
            var query = await _menuManager.GetSys_MenuList();
            var query1 = await _roleAppService.GetAllPermissions();
            //TODO  其他相關操作 
            return query;
        }
    }
}

相關文章