IwbZeroAsyncCrudAppServiceBase.cs 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data.Entity.Infrastructure;
  4. using System.Linq;
  5. using System.Linq.Dynamic.Core;
  6. using System.Threading.Tasks;
  7. using System.Web.Mvc;
  8. using Abp.Application.Services;
  9. using Abp.Application.Services.Dto;
  10. using Abp.Auditing;
  11. using Abp.Authorization;
  12. using Abp.Domain.Entities;
  13. using Abp.Domain.Repositories;
  14. using Abp.Extensions;
  15. using Abp.Linq;
  16. using Abp.Linq.Extensions;
  17. using Abp.Runtime.Caching;
  18. using Abp.UI;
  19. using IwbZero.IdentityFramework;
  20. using IwbZero.Runtime.Session;
  21. using IwbZero.ToolCommon;
  22. using IwbZero.ToolCommon.LogHelpers;
  23. using IwbZero.ToolCommon.Lambda;
  24. using Microsoft.AspNet.Identity;
  25. namespace IwbZero.AppServiceBase
  26. {
  27. public abstract class IwbZeroAsyncCrudAppService<TEntity, TEntityDto, TPrimaryKey, TGetAllInput, TCreateInput, TUpdateInput, TGetInput, TDeleteInput>
  28. : ApplicationService,
  29. IIwbZeroAsyncCrudAppService<TEntityDto, TPrimaryKey, TGetAllInput, TCreateInput, TUpdateInput, TGetInput, TDeleteInput>
  30. where TEntity : class, IEntity<TPrimaryKey>
  31. where TEntityDto : IEntityDto<TPrimaryKey>
  32. where TUpdateInput : IEntityDto<TPrimaryKey>
  33. where TGetInput : IEntityDto<TPrimaryKey>
  34. where TDeleteInput : IEntityDto<TPrimaryKey>
  35. {
  36. protected readonly IRepository<TEntity, TPrimaryKey> Repository;
  37. protected IwbZeroAsyncCrudAppService(IRepository<TEntity, TPrimaryKey> repository, string keyFiledName = null)
  38. {
  39. KeyFiledName = keyFiledName;
  40. AsyncQueryableExecuter = NullAsyncQueryableExecuter.Instance;
  41. LocalizationSourceName = IwbZeroConsts.LocalizationSourceName;
  42. Repository = repository;
  43. AbpSession = NullIwbSession.Instance;
  44. }
  45. #region 字段、属性
  46. public new IIwbSession AbpSession { get; set; }
  47. public ICacheManager CacheManager { get; set; }
  48. public IAsyncQueryableExecuter AsyncQueryableExecuter { get; set; }
  49. /// <summary>
  50. /// 自定义唯一字段名称(主键)
  51. /// </summary>
  52. protected string KeyFiledName { get; set; }
  53. /// <summary>
  54. /// 是否自动生成自定义字段(GUID)
  55. /// </summary>
  56. protected virtual bool KeyIsAuto { get; set; } = true;
  57. /// <summary>
  58. /// 自定义唯一字段存在提示信息
  59. /// </summary>
  60. protected virtual string KeyExistMessage { get; set; }
  61. protected virtual string ExistMessage => string.IsNullOrEmpty(KeyExistMessage) ? L("KeyExistMessage") : KeyExistMessage;
  62. /// <summary>
  63. /// 自定义唯一字段不存在提示信息
  64. /// </summary>
  65. protected virtual string KeyNotExistMessage { get; set; }
  66. protected virtual string NotExistMessage => string.IsNullOrEmpty(KeyNotExistMessage) ? L("KeyNotExistMessage") : KeyNotExistMessage;
  67. protected virtual string GetPermissionName { get; set; }
  68. protected virtual string GetAllPermissionName { get; set; }
  69. protected virtual string CreatePermissionName { get; set; }
  70. protected virtual string UpdatePermissionName { get; set; }
  71. protected virtual string DeletePermissionName { get; set; }
  72. #endregion 字段、属性
  73. #region SelectList
  74. /// <summary>
  75. /// 获取 下拉框选项
  76. /// </summary>
  77. /// <returns></returns>
  78. [DisableAuditing]
  79. public virtual async Task<List<SelectListItem>> GetSelectList()
  80. {
  81. var list = await Repository.GetAllListAsync();
  82. var sList = new List<SelectListItem>();
  83. foreach (var l in list)
  84. {
  85. sList.Add(new SelectListItem() { Value = $"{l.Id}", Text = $"{l.Id}" });
  86. }
  87. return sList;
  88. }
  89. /// <summary>
  90. /// 获取 下拉框选项
  91. /// </summary>
  92. /// <returns></returns>
  93. [DisableAuditing]
  94. public virtual async Task<string> GetSelectStr()
  95. {
  96. var list = await Repository.GetAllListAsync();
  97. string options = "";
  98. foreach (var l in list)
  99. {
  100. options += "<option value=\"" + $"{l.Id}" + "\">" + $"{l.Id}" + "</option>";
  101. }
  102. return options;
  103. }
  104. #endregion SelectList
  105. #region CURD
  106. #region Query
  107. #region GetEntity/Dto
  108. /// <summary>
  109. /// 查询实体Dto
  110. /// </summary>
  111. /// <param name="input"></param>
  112. /// <returns></returns>
  113. [DisableAuditing]
  114. public virtual async Task<TEntityDto> GetDto(TGetInput input)
  115. {
  116. var entity = await GetEntity(input);
  117. return MapToEntityDto(entity);
  118. }
  119. /// <summary>
  120. /// 查询实体Dto
  121. /// </summary>
  122. /// <param name="id"></param>
  123. /// <returns></returns>
  124. [DisableAuditing]
  125. public virtual async Task<TEntityDto> GetDtoById(TPrimaryKey id)
  126. {
  127. var entity = await GetEntityById(id);
  128. return MapToEntityDto(entity);
  129. }
  130. /// <summary>
  131. /// 查询实体Dto(需指明自定义字段)
  132. /// </summary>
  133. /// <param name="no"></param>
  134. /// <returns></returns>
  135. [DisableAuditing]
  136. public virtual async Task<TEntityDto> GetDtoByNo(string no)
  137. {
  138. var entity = await GetEntityByNo(no);
  139. return MapToEntityDto(entity);
  140. }
  141. /// <summary>
  142. /// 查询实体
  143. /// </summary>
  144. /// <param name="input"></param>
  145. /// <returns></returns>
  146. [DisableAuditing]
  147. public virtual async Task<TEntity> GetEntity(TGetInput input)
  148. {
  149. var entity = await GetEntityById(input.Id);
  150. return entity;
  151. }
  152. /// <summary>
  153. /// 查询实体
  154. /// </summary>
  155. /// <param name="id"></param>
  156. /// <returns></returns>
  157. [DisableAuditing]
  158. public virtual async Task<TEntity> GetEntityById(TPrimaryKey id)
  159. {
  160. var exp = LambdaHelper.CreatePrimaryKeyExp<TEntity, TPrimaryKey>(id);
  161. if (exp == null)
  162. {
  163. CheckErrors(string.Format(L("NoEntity"), id));
  164. }
  165. return await Repository.FirstOrDefaultAsync(exp);
  166. }
  167. /// <summary>
  168. /// 查询实体(需指明自定义字段)
  169. /// </summary>
  170. /// <param name="no"></param>
  171. /// <returns></returns>
  172. [DisableAuditing]
  173. public virtual async Task<TEntity> GetEntityByNo(string no)
  174. {
  175. //CheckGetPermission();
  176. if (string.IsNullOrEmpty(KeyFiledName))
  177. {
  178. ThrowError("NoKeyFieldName");
  179. }
  180. //LambdaObject obj = new LambdaObject()
  181. //{
  182. // FieldType = LambdaFieldType.S,
  183. // FieldName = KeyFiledName,
  184. // FieldValue = no,
  185. // ExpType = LambdaExpType.Equal
  186. //};
  187. //var exp = obj.GetExp<TEntity>();
  188. var exp = LambdaHelper.CreateFieldExp<TEntity>(KeyFiledName, no);
  189. return exp == null ? null : await Repository.FirstOrDefaultAsync(exp);
  190. }
  191. #endregion GetEntity/Dto
  192. /// <summary>
  193. /// 分页查询
  194. /// </summary>
  195. /// <param name="input"></param>
  196. /// <returns></returns>
  197. [DisableAuditing]
  198. public virtual async Task<PagedResultDto<TEntityDto>> GetAll(TGetAllInput input)
  199. {
  200. CheckGetAllPermission();
  201. var query = CreateFilteredQuery(input);
  202. var totalCount = await AsyncQueryableExecuter.CountAsync(query);
  203. query = ApplySorting(query, input);
  204. query = ApplyPaging(query, input);
  205. var entities = await AsyncQueryableExecuter.ToListAsync(query);
  206. return new PagedResultDto<TEntityDto>(
  207. totalCount,
  208. entities.Select(MapToEntityDto).ToList()
  209. );
  210. }
  211. /// <summary>
  212. /// 排序
  213. /// </summary>
  214. /// <param name="query">The query.</param>
  215. /// <param name="input">The input.</param>
  216. protected virtual IQueryable<TEntity> ApplySorting(IQueryable<TEntity> query, TGetAllInput input)
  217. {
  218. return input is ISortedResultRequest sortInput
  219. ? sortInput.Sorting.IsNullOrWhiteSpace() ? SelfSorting(query, input) :
  220. query.OrderBy(sortInput.Sorting)
  221. : _ApplySorting(query, input);
  222. }
  223. protected virtual IQueryable<TEntity> SelfSorting(IQueryable<TEntity> query, TGetAllInput input)
  224. {
  225. return query.OrderByDescending(a => a.Id);
  226. }
  227. /// <summary>
  228. /// 排序
  229. /// </summary>
  230. /// <param name="query">The query.</param>
  231. /// <param name="input">The input.</param>
  232. protected IQueryable<T> _ApplySorting<T>(IQueryable<T> query, TGetAllInput input)
  233. {
  234. //Try to sort query if available
  235. var sortInput = input as ISortedResultRequest;
  236. if (sortInput != null)
  237. {
  238. if (!sortInput.Sorting.IsNullOrWhiteSpace())
  239. {
  240. return query.OrderBy(sortInput.Sorting);
  241. }
  242. }
  243. //IQueryable.Task requires sorting, so we should sort if Take will be used.
  244. if (input is ILimitedResultRequest)
  245. {
  246. return query.OrderBy("Id DESC");
  247. }
  248. //No sorting
  249. return query;
  250. }
  251. /// <summary>
  252. /// 分页
  253. /// </summary>
  254. /// <param name="query">The query.</param>
  255. /// <param name="input">The input.</param>
  256. protected virtual IQueryable<TEntity> ApplyPaging(IQueryable<TEntity> query, TGetAllInput input)
  257. {
  258. return _ApplyPaging(query, input);
  259. }
  260. /// <summary>
  261. /// 分页
  262. /// </summary>
  263. /// <param name="query">The query.</param>
  264. /// <param name="input">The input.</param>
  265. protected IQueryable<T> _ApplyPaging<T>(IQueryable<T> query, TGetAllInput input)
  266. {
  267. var pagedInput = input as IPagedResultRequest;
  268. if (pagedInput?.MaxResultCount<=0)
  269. {
  270. return query;
  271. }
  272. //Try to use paging if available
  273. if (pagedInput != null)
  274. {
  275. return query.PageBy(pagedInput);
  276. }
  277. var limitedInput = input as ILimitedResultRequest;
  278. if (limitedInput?.MaxResultCount <= 0)
  279. {
  280. return query;
  281. }
  282. //Try to limit query result if available
  283. if (limitedInput != null)
  284. {
  285. return query.Take(limitedInput.MaxResultCount);
  286. }
  287. //No paging
  288. return query;
  289. }
  290. /// <summary>
  291. /// 根据给定的<see cref="TGetAllInput"/>创建 <see cref="IQueryable{TEntity}"/>过滤查询.
  292. /// </summary>
  293. /// <param name="input">The input.</param>
  294. protected virtual IQueryable<TEntity> CreateFilteredQuery(TGetAllInput input)
  295. {
  296. var query = ApplyFilter(input);
  297. return query;
  298. }
  299. /// <summary>
  300. /// 过滤查询条件
  301. /// </summary>
  302. protected virtual IQueryable<TEntity> ApplyFilter(TGetAllInput input)
  303. {
  304. var query = Repository.GetAll();
  305. return ApplyFilter(query, input);
  306. }
  307. /// <summary>
  308. /// 过滤查询条件
  309. /// </summary>
  310. protected virtual IQueryable<TEntity> ApplyFilter(IQueryable<TEntity> query, TGetAllInput input)
  311. {
  312. var pagedInput = input as IIwbPagedRequest;
  313. if (pagedInput == null)
  314. {
  315. return query;
  316. }
  317. if (!string.IsNullOrEmpty(pagedInput.KeyWords))
  318. {
  319. query = pagedInput.KeyField.ToLower() == "keyword" ? KeyWordFilter(query, pagedInput.KeyWords) : KeyWordFilter(query, pagedInput);
  320. }
  321. return SearchListFilter(query, pagedInput);
  322. }
  323. protected virtual IQueryable<TEntity> KeyWordFilter(IQueryable<TEntity> query, string keyword)
  324. {
  325. return query;
  326. }
  327. /// <summary>
  328. /// 过滤查询条件
  329. /// </summary>
  330. protected virtual IQueryable<T> _ApplyFilter<T>(IQueryable<T> query, TGetAllInput input)
  331. {
  332. var pagedInput = input as IIwbPagedRequest;
  333. if (pagedInput == null)
  334. {
  335. return query;
  336. }
  337. query = KeyWordFilter(query, pagedInput);
  338. query = SearchListFilter(query, pagedInput);
  339. return query;
  340. }
  341. /// <summary>
  342. /// 关键字查询
  343. /// </summary>
  344. /// <typeparam name="T"></typeparam>
  345. /// <param name="query"></param>
  346. /// <param name="pagedInput"></param>
  347. /// <returns></returns>
  348. protected IQueryable<T> KeyWordFilter<T>(IQueryable<T> query, IIwbPagedRequest pagedInput)
  349. {
  350. if (string.IsNullOrEmpty(pagedInput.KeyWords)||string.IsNullOrEmpty(pagedInput.KeyField)|| pagedInput.KeyField.ToLower() == "keyword")
  351. {
  352. return query;
  353. }
  354. object keyWords = pagedInput.KeyWords;
  355. LambdaObject obj = new LambdaObject()
  356. {
  357. FieldType = (LambdaFieldType)pagedInput.FieldType,
  358. FieldName = pagedInput.KeyField,
  359. FieldValue = keyWords,
  360. ExpType = (LambdaExpType)pagedInput.ExpType
  361. };
  362. var exp = obj.GetExp<T>();
  363. query = exp != null ? query.Where(exp) : query;
  364. return query;
  365. }
  366. /// <summary>
  367. /// 多个条件查询
  368. /// </summary>
  369. /// <typeparam name="T"></typeparam>
  370. /// <param name="query"></param>
  371. /// <param name="pagedInput"></param>
  372. /// <returns></returns>
  373. protected IQueryable<T> SearchListFilter<T>(IQueryable<T> query, IIwbPagedRequest pagedInput)
  374. {
  375. if (pagedInput.SearchList != null && pagedInput.SearchList.Count > 0)
  376. {
  377. List<LambdaObject> objList = SelfFilter(pagedInput.SearchList) ?? new List<LambdaObject>();
  378. foreach (var o in pagedInput.SearchList)
  379. {
  380. if (string.IsNullOrEmpty(o.KeyWords))
  381. continue;
  382. object keyWords = o.KeyWords;
  383. objList.Add(new LambdaObject
  384. {
  385. FieldType = (LambdaFieldType)o.FieldType,
  386. FieldName = o.KeyField,
  387. FieldValue = keyWords,
  388. ExpType = (LambdaExpType)o.ExpType
  389. });
  390. }
  391. var exp = objList.GetExp<T>();
  392. query = exp != null ? query.Where(exp) : query;
  393. }
  394. return query;
  395. }
  396. protected IQueryable<T> SearchListFilter<T>(IQueryable<T> query, List<MultiSearchRequest> searchList)
  397. {
  398. if (searchList != null && searchList.Count > 0)
  399. {
  400. List<LambdaObject> objList = SelfFilter(searchList) ?? new List<LambdaObject>();
  401. foreach (var o in searchList)
  402. {
  403. if (string.IsNullOrEmpty(o.KeyWords))
  404. continue;
  405. object keyWords = o.KeyWords;
  406. objList.Add(new LambdaObject
  407. {
  408. FieldType = (LambdaFieldType)o.FieldType,
  409. FieldName = o.KeyField,
  410. FieldValue = keyWords,
  411. ExpType = (LambdaExpType)o.ExpType
  412. });
  413. }
  414. var exp = objList.GetExp<T>();
  415. query = exp != null ? query.Where(exp) : query;
  416. }
  417. return query;
  418. }
  419. /// <summary>
  420. /// 特殊条件时,自定义查询 (使用完该字段查询条件时,应该从search list里清除)
  421. /// </summary>
  422. /// <param name="list"></param>
  423. /// <returns></returns>
  424. protected virtual List<LambdaObject> SelfFilter(List<MultiSearchRequest> list)
  425. {
  426. return null;
  427. }
  428. #endregion Query
  429. /// <summary>
  430. /// 添加
  431. /// </summary>
  432. /// <param name="input"></param>
  433. /// <returns></returns>
  434. public virtual async Task Create(TCreateInput input)
  435. {
  436. CheckCreatePermission();
  437. await CreateEntity(input);
  438. }
  439. /// <summary>
  440. /// 添加
  441. /// </summary>
  442. /// <param name="input"></param>
  443. /// <param name="isCheck"></param>
  444. /// <returns></returns>
  445. protected async Task<TEntityDto> CreateEntity(TCreateInput input, bool isCheck = true)
  446. {
  447. if (!KeyFiledName.IsNullOrEmpty())
  448. {
  449. var fieldValue = input.GetFiledValue<string>(KeyFiledName);
  450. if (KeyIsAuto && fieldValue.IsNullOrEmpty())
  451. {
  452. input.SetFiledValue(KeyFiledName, Guid.NewGuid().ToString("N"));
  453. }
  454. else
  455. {
  456. if (isCheck)
  457. {
  458. var exp = LambdaHelper.CreateFieldExp<TEntity>(KeyFiledName, fieldValue);
  459. if (await Repository.FirstOrDefaultAsync(exp) != null)
  460. {
  461. CheckErrors(ExistMessage);
  462. }
  463. }
  464. }
  465. }
  466. var entity = MapToEntity(input);
  467. await Repository.InsertAsync(entity);
  468. await CurrentUnitOfWork.SaveChangesAsync();
  469. return MapToEntityDto(entity);
  470. }
  471. /// <summary>
  472. /// 修改
  473. /// </summary>
  474. /// <param name="input"></param>
  475. /// <returns></returns>
  476. public virtual async Task Update(TUpdateInput input)
  477. {
  478. CheckUpdatePermission();
  479. await UpdateEntity(input);
  480. }
  481. /// <summary>
  482. /// 修改
  483. /// </summary>
  484. /// <param name="input"></param>
  485. /// <param name="entity"></param>
  486. /// <returns></returns>
  487. protected async Task<TEntityDto> UpdateEntity(TUpdateInput input, TEntity entity = null)
  488. {
  489. entity = entity ?? await GetEntityById(input.Id);
  490. if (entity == null)
  491. {
  492. CheckErrors(NotExistMessage);
  493. }
  494. MapToEntity(input, entity);
  495. await CurrentUnitOfWork.SaveChangesAsync();
  496. return MapToEntityDto(entity);
  497. }
  498. /// <summary>
  499. /// 删除
  500. /// </summary>
  501. /// <param name="input"></param>
  502. /// <returns></returns>
  503. public virtual Task Delete(TDeleteInput input)
  504. {
  505. CheckDeletePermission();
  506. return DeleteEntity(input);
  507. }
  508. /// <summary>
  509. /// 删除
  510. /// </summary>
  511. /// <param name="input"></param>
  512. /// <param name="isCheckNull"></param>
  513. /// <returns></returns>
  514. protected async Task DeleteEntity(TDeleteInput input, bool isCheckNull = true)
  515. {
  516. if (isCheckNull && !string.IsNullOrEmpty(KeyFiledName))
  517. {
  518. LambdaObject obj = new LambdaObject()
  519. {
  520. FieldType = LambdaFieldType.S,
  521. FieldName = KeyFiledName,
  522. FieldValue = input.GetFiledValue<string>(KeyFiledName),
  523. ExpType = LambdaExpType.Equal
  524. };
  525. var exp = obj.GetExp<TEntity>();
  526. if (exp != null && await Repository.FirstOrDefaultAsync(exp) == null)
  527. {
  528. CheckErrors(NotExistMessage);
  529. }
  530. }
  531. try
  532. {
  533. await Repository.DeleteAsync(input.Id);
  534. await CurrentUnitOfWork.SaveChangesAsync();
  535. }
  536. catch (DbUpdateException de)
  537. {
  538. this.LogError(de);
  539. ThrowError("CanNotCascadeDeleteMessage");
  540. }
  541. catch (Exception e)
  542. {
  543. CheckErrors(e.Message);
  544. }
  545. }
  546. #endregion CURD
  547. #region MAP
  548. protected virtual TEntityDto MapToEntityDto(TEntity entity)
  549. {
  550. return ObjectMapper.Map<TEntityDto>(entity);
  551. }
  552. protected virtual TEntity MapToEntity(TCreateInput createInput)
  553. {
  554. return ObjectMapper.Map<TEntity>(createInput);
  555. }
  556. protected virtual void MapToEntity(TUpdateInput updateInput, TEntity entity)
  557. {
  558. ObjectMapper.Map(updateInput, entity);
  559. }
  560. protected virtual TOut IwbMap<TOut>(object obj)
  561. {
  562. return ObjectMapper.Map<TOut>(obj);
  563. }
  564. protected virtual TOut IwbMap<TOut, TIn>(TIn obj)
  565. {
  566. return ObjectMapper.Map<TOut>(obj);
  567. }
  568. #endregion MAP
  569. #region CHECK
  570. protected virtual int CheckGuid(int? guid)
  571. {
  572. if (guid == null || guid == 0)
  573. {
  574. ThrowError("GetGuidNoError");
  575. return 0;
  576. }
  577. return (int)guid;
  578. }
  579. protected virtual void CheckErrors(string error)
  580. {
  581. throw new UserFriendlyException(error);
  582. }
  583. protected virtual void CheckErrors(IdentityResult identityResult)
  584. {
  585. identityResult.CheckErrors(LocalizationManager);
  586. }
  587. /// <summary>
  588. /// 抛出错误
  589. /// </summary>
  590. /// <param name="err"></param>
  591. /// <param name="isLocalization">是否要本地化</param>
  592. protected virtual void ThrowError(string err, bool isLocalization = true)
  593. {
  594. CheckErrors(isLocalization ? L(err) : err);
  595. }
  596. protected virtual void CheckPermission(string permissionName)
  597. {
  598. if (!string.IsNullOrEmpty(permissionName))
  599. {
  600. PermissionChecker.Authorize(permissionName);
  601. }
  602. }
  603. protected virtual void CheckGetPermission()
  604. {
  605. CheckPermission(GetPermissionName);
  606. }
  607. protected virtual void CheckGetAllPermission()
  608. {
  609. CheckPermission(GetAllPermissionName);
  610. }
  611. protected virtual void CheckCreatePermission()
  612. {
  613. CheckPermission(CreatePermissionName);
  614. }
  615. protected virtual void CheckUpdatePermission()
  616. {
  617. CheckPermission(UpdatePermissionName);
  618. }
  619. protected virtual void CheckDeletePermission()
  620. {
  621. CheckPermission(DeletePermissionName);
  622. }
  623. #endregion CHECK
  624. }
  625. #region AppServiceBase
  626. public abstract class IwbZeroAsyncCrudAppService<TEntity, TEntityDto>
  627. : IwbZeroAsyncCrudAppService<TEntity, TEntityDto, int>
  628. where TEntity : class, IEntity<int>
  629. where TEntityDto : IEntityDto<int>
  630. {
  631. protected IwbZeroAsyncCrudAppService(IRepository<TEntity, int> repository, string keyFiledName = null)
  632. : base(repository)
  633. {
  634. KeyFiledName = keyFiledName;
  635. }
  636. }
  637. public abstract class IwbZeroAsyncCrudAppService<TEntity, TEntityDto, TPrimaryKey>
  638. : IwbZeroAsyncCrudAppService<TEntity, TEntityDto, TPrimaryKey, PagedAndSortedResultRequestDto>
  639. where TEntity : class, IEntity<TPrimaryKey>
  640. where TEntityDto : IEntityDto<TPrimaryKey>
  641. {
  642. protected IwbZeroAsyncCrudAppService(IRepository<TEntity, TPrimaryKey> repository, string keyFiledName = null)
  643. : base(repository)
  644. {
  645. KeyFiledName = keyFiledName;
  646. }
  647. }
  648. public abstract class IwbZeroAsyncCrudAppService<TEntity, TEntityDto, TPrimaryKey, TGetAllInput>
  649. : IwbZeroAsyncCrudAppService<TEntity, TEntityDto, TPrimaryKey, TGetAllInput, TEntityDto, TEntityDto>
  650. where TEntity : class, IEntity<TPrimaryKey>
  651. where TEntityDto : IEntityDto<TPrimaryKey>
  652. {
  653. protected IwbZeroAsyncCrudAppService(IRepository<TEntity, TPrimaryKey> repository, string keyFiledName = null)
  654. : base(repository)
  655. {
  656. KeyFiledName = keyFiledName;
  657. }
  658. }
  659. public abstract class IwbZeroAsyncCrudAppService<TEntity, TEntityDto, TPrimaryKey, TGetAllInput, TCreateInput>
  660. : IwbZeroAsyncCrudAppService<TEntity, TEntityDto, TPrimaryKey, TGetAllInput, TCreateInput, TCreateInput>
  661. where TGetAllInput : IPagedAndSortedResultRequest
  662. where TEntity : class, IEntity<TPrimaryKey>
  663. where TEntityDto : IEntityDto<TPrimaryKey>
  664. where TCreateInput : IEntityDto<TPrimaryKey>
  665. {
  666. protected IwbZeroAsyncCrudAppService(IRepository<TEntity, TPrimaryKey> repository, string keyFiledName = null)
  667. : base(repository)
  668. {
  669. KeyFiledName = keyFiledName;
  670. }
  671. }
  672. public abstract class IwbZeroAsyncCrudAppService<TEntity, TEntityDto, TPrimaryKey, TGetAllInput, TCreateInput, TUpdateInput>
  673. : IwbZeroAsyncCrudAppService<TEntity, TEntityDto, TPrimaryKey, TGetAllInput, TCreateInput, TUpdateInput, EntityDto<TPrimaryKey>>
  674. where TEntity : class, IEntity<TPrimaryKey>
  675. where TEntityDto : IEntityDto<TPrimaryKey>
  676. where TUpdateInput : IEntityDto<TPrimaryKey>
  677. {
  678. protected IwbZeroAsyncCrudAppService(IRepository<TEntity, TPrimaryKey> repository, string keyFiledName = null)
  679. : base(repository)
  680. {
  681. KeyFiledName = keyFiledName;
  682. }
  683. }
  684. public abstract class IwbZeroAsyncCrudAppService<TEntity, TEntityDto, TPrimaryKey, TGetAllInput, TCreateInput, TUpdateInput, TGetInput>
  685. : IwbZeroAsyncCrudAppService<TEntity, TEntityDto, TPrimaryKey, TGetAllInput, TCreateInput, TUpdateInput, TGetInput, EntityDto<TPrimaryKey>>
  686. where TEntity : class, IEntity<TPrimaryKey>
  687. where TEntityDto : IEntityDto<TPrimaryKey>
  688. where TUpdateInput : IEntityDto<TPrimaryKey>
  689. where TGetInput : IEntityDto<TPrimaryKey>
  690. {
  691. protected IwbZeroAsyncCrudAppService(IRepository<TEntity, TPrimaryKey> repository, string keyFiledName = null)
  692. : base(repository)
  693. {
  694. KeyFiledName = keyFiledName;
  695. }
  696. }
  697. #endregion AppServiceBase
  698. }