為什么選擇ABP框架


ABP框架已有通用的系統功能:授權,驗證,異常處理,日志,本地化,數據庫連接管理,設置管理,審計日志

1、依賴注入:ABP使用並提供常規的依賴注入。可以簡單地注入任何依賴項(例如:IRepository <Authorization.Tasks.Task>)。(由於ABP授權認證的方法不能使用與私有方                           法、靜態方法和非注入方法,所以一般的方法都需要使用依賴注入的方式)

2、倉儲:ABP可以為每一個實體創建一個默認的倉儲(倉儲是接口寫了好增刪改查的方法,然后用倉儲來執行 。)

3、自動映射:使用ABP的IObjectMapper的MapTo方法輕松地將屬性從一個對象映射到另一個對象。

4、日志記錄:在ABP框架中可以直接使用日志log4net,在MyABP.Web.Mvc中的Startup的ConfigureServices方法中可以修改成其他類型的日志

(  options => options.IocManager.IocContainer.AddFacility<LoggingFacility>(f => f.UseAbpLog4Net().WithConfig("log4net.config")

 public class TaskAppService : MyABPAppServiceBase, ITaskAppService
    {//由於Abp框架要求使用依賴注入,這里的taskRepository和Logger 都是使用了依賴注入方式
        private readonly IRepository<Authorization.Tasks.Task> _taskRepository;//定義倉儲
        public ILogger Logger { get; set; } 
        public TaskAppService(IRepository<Authorization.Tasks.Task> taskRepository)
        {
            _taskRepository = taskRepository;
            Logger = NullLogger.Instance;
        }

        public async Task<ListResultDto<TaskListDto>> GetAll(GetAllTasksInput input)
        {
            var tasks = await _taskRepository
                .GetAll()//這里利用倉儲查詢數據
                .Include(t => t.AssignedPerson)
                .WhereIf(input.State.HasValue, t => t.State == input.State.Value)
                .OrderByDescending(t => t.CreationTime)
                .ToListAsync();

            return new ListResultDto<TaskListDto>(
                ObjectMapper.Map<List<TaskListDto>>(tasks)//自動映射
            );
        }

        public async Task Create(CreateTaskInput input)
        {
            var task = ObjectMapper.Map<Authorization.Tasks. Task>(input);
            await _taskRepository.InsertAsync(task);//利用倉儲插入一條數據
            Logger.Info("Creating a new task with description: " + input.Description);//使用日志
        }


    }

5、自定義映射:一、定義接口IDtoMapping

using AutoMapper;

namespace MyABP
{
    /// <summary>
    ///     實現該接口以進行映射規則創建
    /// </summary>
    internal interface IDtoMapping
    {
        void CreateMapping(IMapperConfigurationExpression mapperConfig);
    }
}
View Code

                        二、定義一個類DtoMapping繼承IDtoMapping,用來定於需要自定義的Dto創建映射類

using AutoMapper;
using MyABP.Authorization.Tasks;
using MyABP.Tasks.DTO;

namespace MyABP
{
    public class DtoMapping : IDtoMapping
    {
      
        public void CreateMapping(IMapperConfigurationExpression mapperConfig)
        {
            //自定義映射
            var taskCacheDtoMapper = mapperConfig.CreateMap<Task, CreateTaskCache>();
            taskCacheDtoMapper.ForMember(dto => dto.title, map => map.MapFrom(m => m.Title));
            taskCacheDtoMapper.ForMember(dto => dto.description, map => map.MapFrom(m => m.Description));
            taskCacheDtoMapper.ForMember(dto => dto.personId, map => map.MapFrom(m => m.AssignedPersonId));



            var taskListDtoMapper = mapperConfig.CreateMap<Task, TaskListDto>();
            taskListDtoMapper.ForMember(dto => dto.Id, map => map.MapFrom(m => m.Id));
            taskListDtoMapper.ForMember(dto => dto.State, map => map.MapFrom(m => m.State));
        }
    }
}
View Code

                        三、在MyABPApplicationModule的Initialize方法中注冊IDtoMapping依賴

//注冊IDtoMapping
            IocManager.IocContainer.Register(
                Classes.FromAssembly(Assembly.GetExecutingAssembly())
                    .IncludeNonPublicTypes()
                    .BasedOn<IDtoMapping>()
                    .WithService.Self()
                    .WithService.DefaultInterfaces()
                    .LifestyleTransient()
            );

            //解析依賴,並進行映射規則創建
            Configuration.Modules.AbpAutoMapper().Configurators.Add(mapper =>
            {
                var mappers = IocManager.IocContainer.ResolveAll<IDtoMapping>();
                foreach (var dtomap in mappers)
                    dtomap.CreateMapping(mapper);
            });
View Code

6、Cache:緩存(這里介紹的是緩存實體)

                   一、定義接口ITasksCache

using MyABP.Tasks.DTO;

namespace MyABP.Application.Tasks
{
    public  interface ITasksCache: IEntityCache<CreateTaskCache>
    {
    }
}
View Code

                  二、定義一個類TasksCache.cs來繼承ITasksCache(其中Task和TaskCacheDto使用第5點中的自定義映射方式完成映射)

using Abp.Domain.Entities.Caching;
using Abp.Domain.Repositories;
using Abp.Runtime.Caching;
using MyABP.Authorization.Tasks;
using MyABP.Tasks.DTO;

namespace MyABP.Application.Tasks
{
    public  class TasksCache : EntityCache<Task, CreateTaskCache>, ITasksCache, ITransientDependency
    {
        public TasksCache(ICacheManager cacheManager, IRepository<Task> repository)
            : base(cacheManager, repository)
        {

        }
    }
}
View Code

                 三、讀取緩存

 

private readonly ITasksCache _tasksCache;//cache
        public TaskAppService(IRepository<Authorization.Tasks.Task> taskRepository, ITasksCache tasksCache)
        {
            _taskRepository = taskRepository;
            Logger = NullLogger.Instance; 
            _tasksCache = tasksCache;
        }
        public async void GetTitle(int id)
        {
             var title=_tasksCache[id].title;
        }
View Code

 

 
 

7、Session:獲取當前用戶、租戶

 public IAbpSession AbpSession { get; set; }//session
        private readonly ITasksCache _tasksCache;//cache
        public TaskAppService(IRepository<Authorization.Tasks.Task> taskRepository, ITasksCache tasksCache)
        {
            _taskRepository = taskRepository;
            Logger = NullLogger.Instance;
            AbpSession = NullAbpSession.Instance;
            _tasksCache = tasksCache;
        }
        public async void GetTitle(int id)
        {
            var userId = AbpSession.UserId;
            var title=_tasksCache[id].title;
        }
View Code

 

 

8、發送郵件:(但是不知道在哪里配置其他相關的)

private readonly IEmailSender _emailSender;
        public TaskAppService(IRepository<Authorization.Tasks.Task> taskRepository, ITasksCache tasksCache, IEmailSender emailSender)
        {
            _taskRepository = taskRepository;
            Logger = NullLogger.Instance;
            AbpSession = NullAbpSession.Instance;
            _tasksCache = tasksCache;
            _emailSender = emailSender;
        }
        public async void GetTitle(int id)
        {
            var userId = AbpSession.UserId;
            var title=_tasksCache[id].title;
            //Send a notification email
            _emailSender.Send(
             to: "1017139259@qq.com",
             subject: "You have a new task!",
             body: $"A new task is assigned for you: <b></b>",
             isBodyHtml: true
         );
        }
View Code

9、菜單權限:根據用戶、角色和租戶的不同,進行划分菜單權限

.AddItem(
                    new MenuItemDefinition(
                        PageNames.Roles,
                        L("Roles"),
                        url: "Roles",
                        icon: "local_offer",
                        requiredPermissionName: PermissionNames.Pages_Roles//這里就是設置權限的
                    )
                )
View Code

10、多語言實體:可以選擇顯示多種語言

11、多時間選擇:MyABP.CoreMyABPCoreModulePostInitialize方法中加入 Clock.Provider = ClockProviders.Utc;

    ClockProviders.Unspecified(UnspecifiedClockProvider):這是默認的時鍾提供程序,其行為類似於 DateTime.Now就像您根本不使用Clock類一樣。

   ClockProviders.Utc(UtcClockProvider):在UTC日期時間工作。 Clock.Now的DateTime.UtcNowNormalize方法將給定的datetime轉換為utc datetime,然后將其種類設                                                                      置為DateTimeKind.UTC。它 支持多個時區

   ClockProviders.Local(LocalClockProvider):在本地計算機的時間工作。Normalize方法將給定日期時間轉換為本地日期時間,並將其種類設置為DateTimeKind.Local。

12、軟刪除:如果要求將軟刪除實體永久刪除,可以使用IRepository.HardDelete擴展方法

     GetAll()方法中獲取的是IsDelete=false的列表

13、字段校驗:在新增或者修改的實體中,可以使用Required設置校驗字段 

14、工作單元

  每個應用服務方法都默認地被認定為一個工作單元。在方法開始前,它自動創建一個連接並開啟一個事務。如果方法成功完成,接着事務會被提交並釋放連接。即使是使用不同的倉儲或是方法,它們都可以是原子性(事務性)的,並且當事務提交時實體中所有的修改都自動地被保存

 

   

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM