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); } }
二、定義一個類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)); } } }
三、在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); });
6、Cache:緩存(這里介紹的是緩存實體)
一、定義接口ITasksCache

using MyABP.Tasks.DTO; namespace MyABP.Application.Tasks { public interface ITasksCache: IEntityCache<CreateTaskCache> { } }
二、定義一個類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) { } } }
三、讀取緩存

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; }
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; }
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 ); }
9、菜單權限:根據用戶、角色和租戶的不同,進行划分菜單權限

.AddItem( new MenuItemDefinition( PageNames.Roles, L("Roles"), url: "Roles", icon: "local_offer", requiredPermissionName: PermissionNames.Pages_Roles//這里就是設置權限的 ) )
10、多語言實體:可以選擇顯示多種語言
11、多時間選擇:在MyABP.Core的MyABPCoreModule的PostInitialize方法中加入 Clock.Provider = ClockProviders.Utc;
ClockProviders.Unspecified(UnspecifiedClockProvider):這是默認的時鍾提供程序,其行為類似於 DateTime.Now。就像您根本不使用Clock類一樣。
ClockProviders.Utc(UtcClockProvider):在UTC日期時間工作。 Clock.Now的DateTime.UtcNow。Normalize方法將給定的datetime轉換為utc datetime,然后將其種類設 置為DateTimeKind.UTC。它 支持多個時區。
ClockProviders.Local(LocalClockProvider):在本地計算機的時間工作。Normalize方法將給定日期時間轉換為本地日期時間,並將其種類設置為DateTimeKind.Local。
12、軟刪除:如果要求將軟刪除實體永久刪除,可以使用IRepository.HardDelete擴展方法
GetAll()方法中獲取的是IsDelete=false的列表
13、字段校驗:在新增或者修改的實體中,可以使用Required設置校驗字段
14、工作單元:
每個應用服務方法都默認地被認定為一個工作單元。在方法開始前,它自動創建一個連接並開啟一個事務。如果方法成功完成,接着事務會被提交並釋放連接。即使是使用不同的倉儲或是方法,它們都可以是原子性(事務性)的,並且當事務提交時實體中所有的修改都自動地被保存