VzCrudAppServiceBase.cs 23 KB

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