Browse Source

第一段提交 Result 代码优化 增加核心 FluentValidation Guids

第二段提交  Result 清AutoMapper
master
2017875139 3 years ago
parent
commit
58610106f2
  1. 4
      .editorconfig
  2. 28
      Easy.sln
  3. 38
      src/Easy.Api/Easy/DDD/Application/Dtos/PagingRequest.cs
  4. 2
      src/Easy.Api/Easy/Extensions/ServiceCollectionServiceExtensions.cs
  5. 2
      src/Easy.Api/Easy/Realization/ApiMapAuto.cs
  6. 2
      src/Easy.Api/Easy/Realization/AppServiceActivator.cs
  7. 2
      src/Easy.Api/Easy/Realization/AppServiceControllerFeatureProvider.cs
  8. 2
      src/Easy.Api/Easy/Realization/ApplicationConvention.cs
  9. 10
      src/Easy.Core/Easy.Core.csproj
  10. 2
      src/Easy.Core/Easy/Check.cs
  11. 6
      src/Easy.Core/Easy/Exceptions/BusinessException.cs
  12. 8
      src/Easy.Core/Easy/When.cs
  13. 2
      src/Easy.DDD.Domain/Easy.DDD.Domain.csproj
  14. 2
      src/Easy.DDD.Domain/Easy/DDD/Domain/Repositories/Repository.cs
  15. 2
      src/Easy.DI/Easy/Extensions/ServiceCollectionServiceExtensions.cs
  16. 2
      src/Easy.DI/Easy/Realization/DependencyInterface.cs
  17. 4
      src/Easy.DI/Easy/Realization/LazyServiceProvider.cs
  18. 20
      src/Easy.FluentValidation/Easy.FluentValidation.csproj
  19. 4
      src/Easy.FluentValidation/Easy/Aop/FluentValidationRegister.cs
  20. 17
      src/Easy.FluentValidation/Easy/Extensions/ServiceCollectionServiceExtensions.cs
  21. 19
      src/Easy.Guids/Easy.Guids.csproj
  22. 19
      src/Easy.Guids/Easy/Enums/SequentialGuidType.cs
  23. 6
      src/Easy.Guids/Easy/Guids/IGuidGenerator.cs
  24. 18
      src/Easy.Guids/Easy/Options/SequentialGuidGeneratorOptions.cs
  25. 68
      src/Easy.Guids/Easy/Realization/SequentialGuidGenerator.cs
  26. 24
      src/Easy.Result/Common/AutoMapReadonly.cs
  27. 6
      src/Easy.Result/Easy.Result.csproj
  28. 56
      src/Easy.Result/Easy/Aop/ApiResultProxy.cs
  29. 60
      src/Easy.Result/Easy/Aop/ErrApiResMiddleware.cs
  30. 2
      src/Easy.Result/Easy/Consts/ApiResultConsts.cs
  31. 45
      src/Easy.Result/Easy/Extensions/ApiResultExtensions.cs
  32. 22
      src/Easy.Result/Easy/Extensions/ApplicationBuilderExtensions.cs
  33. 17
      src/Easy.Result/Easy/Extensions/ServiceCollectionServiceExtensions.cs
  34. 65
      src/Easy.Result/Easy/IEntities.cs
  35. 7
      src/Easy.Result/Easy/IEntity.cs
  36. 8
      src/Easy.Result/Easy/IModel.cs
  37. 19
      src/Easy.Result/Easy/Result/ApiResult.cs
  38. 11
      src/Easy.Result/Easy/Result/ApiResultPaged.cs
  39. 7
      src/Easy.Result/Easy/Result/ApiResultValues.cs
  40. 9
      src/Easy.Uow/Easy/Aop/UowProxy.cs
  41. 5
      src/Easy.Uow/Easy/Extensions/ServiceCollectionServiceExtensions.cs
  42. 6
      src/Easy.Uow/Easy/Realization/UnitOfWork.cs
  43. 3
      test/WebApplication/GraphDbContext.cs
  44. 0
      test/WebApplication/PagingRequest.cs

4
.editorconfig

@ -0,0 +1,4 @@
[*.cs]
# CA1848: 使用 LoggerMessage 委托
dotnet_diagnostic.CA1848.severity = none

28
Easy.sln

@ -15,12 +15,16 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Easy.Uow", "src\Easy.Uow\Ea
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Easy.Specifications", "src\Easy.Specifications\Easy.Specifications.csproj", "{9C37245E-66EE-4F3A-8713-7B59379422FE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebApplication", "test\WebApplication\WebApplication.csproj", "{4383A8FF-5E4F-4772-B86F-29264AFB511B}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Easy.DDD", "Easy.DDD", "{A263D7E3-0153-48D0-822D-E3E0B51A4890}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Easy", "Easy", "{E2F1B3BA-DD92-4729-BDD0-91BB936520C0}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Easy.Guids", "src\Easy.Guids\Easy.Guids.csproj", "{1B91E50D-7E98-4B94-9BCA-76BB0423FB97}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Easy.Core", "src\Easy.Core\Easy.Core.csproj", "{EF3CD7D3-DC58-4A36-BB6D-BB87EDAE7408}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Easy.FluentValidation", "src\Easy.FluentValidation\Easy.FluentValidation.csproj", "{8EC50AAD-EB45-402A-B474-A94EDBD342A3}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -51,10 +55,18 @@ Global
{9C37245E-66EE-4F3A-8713-7B59379422FE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9C37245E-66EE-4F3A-8713-7B59379422FE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9C37245E-66EE-4F3A-8713-7B59379422FE}.Release|Any CPU.Build.0 = Release|Any CPU
{4383A8FF-5E4F-4772-B86F-29264AFB511B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4383A8FF-5E4F-4772-B86F-29264AFB511B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4383A8FF-5E4F-4772-B86F-29264AFB511B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4383A8FF-5E4F-4772-B86F-29264AFB511B}.Release|Any CPU.Build.0 = Release|Any CPU
{1B91E50D-7E98-4B94-9BCA-76BB0423FB97}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1B91E50D-7E98-4B94-9BCA-76BB0423FB97}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1B91E50D-7E98-4B94-9BCA-76BB0423FB97}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1B91E50D-7E98-4B94-9BCA-76BB0423FB97}.Release|Any CPU.Build.0 = Release|Any CPU
{EF3CD7D3-DC58-4A36-BB6D-BB87EDAE7408}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EF3CD7D3-DC58-4A36-BB6D-BB87EDAE7408}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EF3CD7D3-DC58-4A36-BB6D-BB87EDAE7408}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EF3CD7D3-DC58-4A36-BB6D-BB87EDAE7408}.Release|Any CPU.Build.0 = Release|Any CPU
{8EC50AAD-EB45-402A-B474-A94EDBD342A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8EC50AAD-EB45-402A-B474-A94EDBD342A3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8EC50AAD-EB45-402A-B474-A94EDBD342A3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8EC50AAD-EB45-402A-B474-A94EDBD342A3}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -62,9 +74,13 @@ Global
GlobalSection(NestedProjects) = preSolution
{689367DF-1216-40A5-91CE-412EE8FE6C8F} = {A263D7E3-0153-48D0-822D-E3E0B51A4890}
{A269FF3D-00BC-499D-A496-46D97D51FE92} = {E2F1B3BA-DD92-4729-BDD0-91BB936520C0}
{82677F0B-E9CF-4491-8B04-9BF9B04B1534} = {E2F1B3BA-DD92-4729-BDD0-91BB936520C0}
{8004C9B6-FF61-44F1-B4CC-F4CF1C8045BF} = {A263D7E3-0153-48D0-822D-E3E0B51A4890}
{A1121475-1403-4133-8F5E-9C5AE020F347} = {E2F1B3BA-DD92-4729-BDD0-91BB936520C0}
{9C37245E-66EE-4F3A-8713-7B59379422FE} = {E2F1B3BA-DD92-4729-BDD0-91BB936520C0}
{1B91E50D-7E98-4B94-9BCA-76BB0423FB97} = {E2F1B3BA-DD92-4729-BDD0-91BB936520C0}
{EF3CD7D3-DC58-4A36-BB6D-BB87EDAE7408} = {E2F1B3BA-DD92-4729-BDD0-91BB936520C0}
{8EC50AAD-EB45-402A-B474-A94EDBD342A3} = {E2F1B3BA-DD92-4729-BDD0-91BB936520C0}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {7260112B-0232-4725-AB84-EF4DCCABFD77}

38
src/Easy.Api/Easy/DDD/Application/Dtos/PagingRequest.cs

@ -0,0 +1,38 @@
namespace Easy.Wapper;
public record PagingRequest
{
private int _pageIndex;
private int _pageSize;
/// <summary>
/// 当前第几页
/// </summary>
public int PageIndex
{
get => _pageIndex;
set
{
if (value <= 0) value = 1;
_pageIndex = value;
}
}
/// <summary>
/// 页面数量
/// </summary>
public int PageSize
{
get => _pageSize;
set
{
if (value <= 9) value = 10;
_pageSize = value;
}
}
/// <summary>
/// 默认是降序
/// </summary>
public bool OrderByDescending { get; set; } = true;
}

2
src/Easy.Api/Easy/Extensions/ServiceCollectionServiceExtensions.cs

@ -1,5 +1,5 @@
using Easy.DDD.Application;
using Easy.DDD.Realization;
using Easy.Realization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.Extensions.DependencyInjection;

2
src/Easy.Api/Easy/DDD/Realization/ApiMapAuto.cs → src/Easy.Api/Easy/Realization/ApiMapAuto.cs

@ -1,4 +1,4 @@
namespace Easy.DDD.Realization;
namespace Easy.Realization;
public class ApiMapAuto
{

2
src/Easy.Api/Easy/DDD/Realization/AppServiceActivator.cs → src/Easy.Api/Easy/Realization/AppServiceActivator.cs

@ -2,7 +2,7 @@
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.Extensions.DependencyInjection;
namespace Easy.DDD.Realization;
namespace Easy.Realization;
internal class AppServiceActivator : IControllerActivator
{

2
src/Easy.Api/Easy/DDD/Realization/AppServiceControllerFeatureProvider.cs → src/Easy.Api/Easy/Realization/AppServiceControllerFeatureProvider.cs

@ -2,7 +2,7 @@
using Microsoft.AspNetCore.Mvc.Controllers;
using System.Reflection;
namespace Easy.DDD.Realization;
namespace Easy.Realization;
internal class AppServiceControllerFeatureProvider : ControllerFeatureProvider
{

2
src/Easy.Api/Easy/DDD/Realization/ApplicationConvention.cs → src/Easy.Api/Easy/Realization/ApplicationConvention.cs

@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Mvc.ApplicationModels;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using System.Reflection;
namespace Easy.DDD.Realization;
namespace Easy.Realization;
internal class ApplicationConvention : IApplicationModelConvention
{

10
src/Easy.Core/Easy.Core.csproj

@ -0,0 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<!--<Nullable>enable</Nullable>-->
<RootNamespace />
</PropertyGroup>
</Project>

2
src/Easy.Result/Easy/Check.cs → src/Easy.Core/Easy/Check.cs

@ -1,6 +1,6 @@
using System.Diagnostics.CodeAnalysis;
namespace Easy.Result;
namespace Easy;
public static class Check
{

6
src/Easy.Result/Easy/Exceptions/SvcException.cs → src/Easy.Core/Easy/Exceptions/BusinessException.cs

@ -1,15 +1,15 @@
namespace Easy.Result.Exceptions;
namespace Easy.Exceptions;
/// <summary>
/// 服务异常
/// </summary>
internal class SvcException : Exception
public class BusinessException : Exception
{
/// <summary>
/// 服务异常
/// </summary>
/// <param name="message">消息</param>
public SvcException(string message)
public BusinessException(string message)
: base(message)
{

8
src/Easy.Result/Easy/When.cs → src/Easy.Core/Easy/When.cs

@ -1,6 +1,6 @@
using Easy.Result.Exceptions;
using Easy.Exceptions;
namespace Easy.Result;
namespace Easy;
/// <summary>
/// when 语句
@ -12,9 +12,9 @@ public class When
/// </summary>
/// <param name="isOk">是否</param>
/// <param name="message">消息</param>
/// <exception cref="SvcException">服务异常会被中间件拦截</exception>
/// <exception cref="BusinessException">服务异常会被中间件拦截</exception>
public static void Is(bool isOk, string message)
{
if (isOk) throw new SvcException(message);
if (isOk) throw new BusinessException(message);
}
}

2
src/Easy.DDD.Domain/Easy.DDD.Domain.csproj

@ -8,7 +8,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="EFCore.BulkExtensions" Version="6.4.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.2" />
</ItemGroup>
</Project>

2
src/Easy.DDD.Domain/Easy/DDD/Domain/Repositories/Repository.cs

@ -1,7 +1,5 @@
using Easy.DDD.Domain.Entities;
using EFCore.BulkExtensions;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.ChangeTracking;
using System.Linq.Expressions;
namespace Easy.DDD.Domain.Repositories;

2
src/Easy.DI/Easy/Extensions/ServiceCollectionServiceExtensions.cs

@ -1,4 +1,4 @@
using Easy.DI.Realization;
using Easy.Realization;
using Microsoft.Extensions.DependencyInjection;
namespace Easy.Extensions;

2
src/Easy.DI/Easy/DI/Realization/DependencyInterface.cs → src/Easy.DI/Easy/Realization/DependencyInterface.cs

@ -2,7 +2,7 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
namespace Easy.DI.Realization;
namespace Easy.Realization;
internal static class DependencyInterface
{

4
src/Easy.DI/Easy/DI/Realization/LazyServiceProvider.cs → src/Easy.DI/Easy/Realization/LazyServiceProvider.cs

@ -1,4 +1,6 @@
namespace Easy.DI.Realization;
using Easy.DI;
namespace Easy.Realization;
public class LazyServiceProvider : ILazyServiceProvider, ITransientDependency
{

20
src/Easy.FluentValidation/Easy.FluentValidation.csproj

@ -0,0 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<!--<Nullable>enable</Nullable>-->
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" Version="6.0.0" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="FluentValidation" Version="10.3.6" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Easy.Core\Easy.Core.csproj" />
</ItemGroup>
</Project>

4
src/Easy.Result/Easy/Aop/FluentValidationRegister.cs → src/Easy.FluentValidation/Easy/Aop/FluentValidationRegister.cs

@ -2,9 +2,9 @@
using FluentValidation.Internal;
using Microsoft.AspNetCore.Mvc.Filters;
namespace Easy.Result.FluentValidation;
namespace Easy.Aop;
public class FluentValidationFilter : IAsyncActionFilter
public class FluentValidationRegister : IAsyncActionFilter
{
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{

17
src/Easy.FluentValidation/Easy/Extensions/ServiceCollectionServiceExtensions.cs

@ -0,0 +1,17 @@
using Easy.Aop;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
namespace Easy.Extensions;
public static class ServiceCollectionServiceExtensions
{
public static IServiceCollection AddUow(this IServiceCollection services)
{
services.Configure<MvcOptions>(options =>
{
options.Filters.Add<FluentValidationRegister>();
});
return services;
}
}

19
src/Easy.Guids/Easy.Guids.csproj

@ -0,0 +1,19 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<!--<Nullable>enable</Nullable>-->
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Options" Version="6.0.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Easy.DI\Easy.DI.csproj" />
</ItemGroup>
</Project>

19
src/Easy.Guids/Easy/Enums/SequentialGuidType.cs

@ -0,0 +1,19 @@
namespace Easy.Enums;
public enum SequentialGuidType
{
/// <summary>
/// MySql and PostgreSql.
/// </summary>
SequentialAsString,
/// <summary>
/// Oracle.
/// </summary>
SequentialAsBinary,
/// <summary>
/// SqlServer.
/// </summary>
SequentialAtEnd
}

6
src/Easy.Guids/Easy/Guids/IGuidGenerator.cs

@ -0,0 +1,6 @@
namespace Easy.Guids;
public interface IGuidGenerator
{
Guid Create();
}

18
src/Easy.Guids/Easy/Options/SequentialGuidGeneratorOptions.cs

@ -0,0 +1,18 @@
using Easy.Enums;
namespace Easy.Options;
public class SequentialGuidGeneratorOptions
{
public SequentialGuidType? SequentialGuidType { get; set; }
public SequentialGuidType GetSequentialGuidType()
{
if (SequentialGuidType == null)
{
throw new ArgumentNullException(nameof(SequentialGuidType),
"not Configure<SequentialGuidGeneratorOptions>(options =>{ options.SequentialGuidType = ???; })");
}
return SequentialGuidType.Value;
}
}

68
src/Easy.Guids/Easy/Realization/SequentialGuidGenerator.cs

@ -0,0 +1,68 @@
using Easy.DI;
using Easy.Enums;
using Easy.Guids;
using Easy.Options;
using Microsoft.Extensions.Options;
using System.Security.Cryptography;
namespace Easy.Realization;
public class SequentialGuidGenerator : IGuidGenerator, ITransientDependency
{
public SequentialGuidGeneratorOptions Options { get; }
private static readonly RandomNumberGenerator RandomNumberGenerator = RandomNumberGenerator.Create();
public SequentialGuidGenerator(IOptions<SequentialGuidGeneratorOptions> options)
{
Options = options.Value;
}
public Guid Create()
{
SequentialGuidType guidType = Options.GetSequentialGuidType();
var randomBytes = new byte[10];
RandomNumberGenerator.GetBytes(randomBytes);
long timestamp = DateTime.UtcNow.Ticks / 10000L;
byte[] timestampBytes = BitConverter.GetBytes(timestamp);
if (BitConverter.IsLittleEndian)
{
Array.Reverse(timestampBytes);
}
byte[] guidBytes = new byte[16];
switch (guidType)
{
case SequentialGuidType.SequentialAsString:
case SequentialGuidType.SequentialAsBinary:
Buffer.BlockCopy(timestampBytes, 2, guidBytes, 0, 6);
Buffer.BlockCopy(randomBytes, 0, guidBytes, 6, 10);
if (guidType == SequentialGuidType.SequentialAsString && BitConverter.IsLittleEndian)
{
Array.Reverse(guidBytes, 0, 4);
Array.Reverse(guidBytes, 4, 2);
}
break;
case SequentialGuidType.SequentialAtEnd:
Buffer.BlockCopy(randomBytes, 0, guidBytes, 0, 10);
Buffer.BlockCopy(timestampBytes, 2, guidBytes, 10, 6);
break;
}
return new Guid(guidBytes);
}
}

24
src/Easy.Result/Common/AutoMapReadonly.cs

@ -1,24 +0,0 @@
using AutoMapper;
using Microsoft.Extensions.DependencyModel;
using System.Reflection;
using System.Runtime.Loader;
namespace Easy.Result.Common;
public class AutoMapReadonly
{
private static IEnumerable<Assembly> Assemblies = DependencyContext.Default.CompileLibraries.
Where(lib => !lib.Serviceable && lib.Type != "package" && lib.Type != "referenceassembly").
Select(lib => AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(lib.Name)));
public readonly static IConfigurationProvider ConfigurationProvider = new MapperConfiguration(cfg =>
{
foreach (var assembly in Assemblies)
{
foreach (var profileType in assembly.GetTypes().Where(o => typeof(Profile).IsAssignableFrom(o)))
{
cfg.AddProfile(profileType);
}
}
});
}

6
src/Easy.Result/Easy.Result.csproj

@ -6,15 +6,13 @@
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
<Copyright></Copyright>
<Version>1.0.2</Version>
<RootNamespace />
<!--<Nullable>enable</Nullable>-->
</PropertyGroup>
<ItemGroup>
<PackageReference Include="FluentValidation" Version="10.3.6" />
<PackageReference Include="AutoMapper" Version="11.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyModel" Version="6.0.0" />
<FrameworkReference Include="Microsoft.AspNetCore.App" Version="6.0.0" />
</ItemGroup>
<ItemGroup>
<Folder Include="Easy\Bases\" />
<ProjectReference Include="..\Easy.Core\Easy.Core.csproj" />
</ItemGroup>
</Project>

56
src/Easy.Result/Easy/Aop/ApiResultProxy.cs

@ -0,0 +1,56 @@
using Easy.Exceptions;
using Easy.Result;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Logging;
namespace Easy.Aop;
public class ApiResultProxy : IAsyncActionFilter
{
private readonly ILoggerFactory LoggerFactory;
public ApiResultProxy(ILoggerFactory loggerFactory)
{
LoggerFactory = loggerFactory;
}
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
var response = context.HttpContext.Response;
var logger = LoggerFactory.CreateLogger(context.Controller.GetType().Name);
try
{
await next();
}
catch (BusinessException ex)
{
await response.WriteAsJsonAsync(new ApiResult()
{
Message = ex.Message,
Status = "RETRY",
});
}
catch (ArgumentNullException ex)
{
const string message = $"参数不能为空";
logger.LogError(ex, message);
await response.WriteAsJsonAsync(new ApiResult()
{
Message = message,
Status = "RETRY",
});
}
catch (Exception ex)
{
const string message = $"出错了,请稍后再试。";
logger.LogError(ex, message);
await response.WriteAsJsonAsync(new ApiResult()
{
Message = message,
Status = "RETRY",
});
}
}
}

60
src/Easy.Result/Easy/Aop/ErrApiResMiddleware.cs

@ -1,60 +0,0 @@
using Easy.Result.Exceptions;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Logging;
namespace Easy.Result.Middlewares;
public class ErrApiResultMiddleware
{
private readonly RequestDelegate _next;
public ErrApiResultMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context, ILoggerFactory loggerFactory)
{
if (context.Request.Path.Value.StartsWith("/api"))
{
var logger = loggerFactory.CreateLogger(nameof(ErrApiResultMiddleware));
try
{
await _next(context);
}
catch (SvcException ex)
{
await context.Response.WriteAsJsonAsync(new ApiResult()
{
Message = ex.Message,
Status = "RETRY",
});
}
catch (ArgumentNullException ex)
{
string message = $"ParamName:{ex.ParamName} is not null!message:{ex.Message}";
await context.Response.WriteAsJsonAsync(new ApiResult()
{
Message = message,
Status = "RETRY",
});
logger.LogError(new EventId(ex.HResult), ex, message);
}
catch (Exception ex)
{
string message = $"ErrMessage = {ex.Message}";
logger.LogError(new EventId(ex.HResult), ex, message);
await context.Response.WriteAsJsonAsync(new ApiResult()
{
Message = "出错了,请稍后再试。",
Status = "RETRY",
});
}
}
else
{
await _next(context);
}
}
}

2
src/Easy.Result/Easy/ApiResultConsts.cs → src/Easy.Result/Easy/Consts/ApiResultConsts.cs

@ -1,4 +1,4 @@
namespace Easy.Result;
namespace Easy.Consts;
public class ApiResultConsts
{

45
src/Easy.Result/Easy/Extensions/ApiResultExtensions.cs

@ -1,7 +1,7 @@
using AutoMapper;
using Easy.Result.Common;
using Easy.Consts;
using Easy.Result;
namespace Easy.Result.Extensions;
namespace Easy.Extensions;
public static class ApiResultExtensions
{
@ -11,15 +11,7 @@ public static class ApiResultExtensions
static public bool IsSuccess<TSource>(this TSource source)
where TSource : ApiResult
{
return source.Status.Equals(ApiResultConsts.SUCCESS);
}
/// <summary>
/// 是重试
/// </summary>
static public bool IsRETRY<TSource>(this TSource source)
where TSource : ApiResult
{
return source.Status.Equals(ApiResultConsts.RETRY);
return source?.Status?.Equals(ApiResultConsts.SUCCESS) ?? false;
}
/// <summary>
/// 成功
@ -48,33 +40,4 @@ public static class ApiResultExtensions
return source;
}
static public TEntity ToEntity<TEntity>(this IModel model)
where TEntity : IEntity, new()
{
return new Mapper(AutoMapReadonly.ConfigurationProvider).Map<TEntity>(model);
}
static public List<TEntity> ToEntities<TEntity>(this IModel models)
where TEntity : IEntity, new()
{
return new Mapper(AutoMapReadonly.ConfigurationProvider).Map<List<TEntity>>(models);
}
static public ApiResultValue<TModel> ToModel<TModel>(this IEntity entity)
where TModel : IModel, new()
{
return ApiResult.Value(new Mapper(AutoMapReadonly.ConfigurationProvider).Map<TModel>(entity) ?? new());
}
static public ApiResultValues<TModel> ToModels<TModel>(this IEntities entities)
{
return ApiResult.Value(new Mapper(AutoMapReadonly.ConfigurationProvider).Map<List<TModel>>(entities.Data) ?? new());
}
static public ApiResultPaged<TModel> ToPagedModel<TModel>(this IPaged paged)
{
return new ApiResultPaged<TModel>()
{
Result = new Mapper(AutoMapReadonly.ConfigurationProvider).Map<List<TModel>>(paged.Data) ?? new(),
PageSize = paged.PageSize,
PageCount = paged.PageCount
};
}
}

22
src/Easy.Result/Easy/Extensions/ApplicationBuilderExtensions.cs

@ -1,22 +0,0 @@
using Easy.Result.FluentValidation;
using Easy.Result.Middlewares;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
namespace Easy.Result.Extensions;
public static class ApplicationBuilderExtensions
{
public static IApplicationBuilder UseErrApiResult(this IApplicationBuilder builder)
{
return builder.UseMiddleware<ErrApiResultMiddleware>();
}
public static IMvcBuilder AddEasyFluentValidation(this IMvcBuilder builder)
{
return builder.AddMvcOptions(options =>
{
options.Filters.Add<FluentValidationFilter>();
});
}
}

17
src/Easy.Result/Easy/Extensions/ServiceCollectionServiceExtensions.cs

@ -0,0 +1,17 @@
using Easy.Aop;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
namespace Easy.Extensions;
public static class ServiceCollectionServiceExtensions
{
public static IServiceCollection AddApiResultProxy(this IServiceCollection services)
{
services.Configure<MvcOptions>(options =>
{
options.Filters.Add<ApiResultProxy>();
});
return services;
}
}

65
src/Easy.Result/Easy/IEntities.cs

@ -1,65 +0,0 @@
namespace Easy.Result;
public interface IEntities
{
/// <summary>
/// 返回结果
/// </summary>
public object Data { get; set; }
public static IEntities Create<TSource>(List<TSource> Data)
{
return new Entites()
{
Data = Data ?? new()
};
}
}
public sealed class Entites : IEntities
{
/// <summary>
/// 返回结果
/// </summary>
public object Data { get; set; }
}
public interface IPaged : IEntities
{
/// <summary>
/// 页面数量
/// </summary>
public long PageCount { get; set; }
/// <summary>
/// 页面大小
/// </summary>
public int PageSize { get; set; }
public static IPaged Create<TSource>(long PageCount, int PageSize, List<TSource> Data)
{
return new Paged()
{
PageCount = PageCount,
Data = Data ?? new(),
PageSize = PageSize,
};
}
}
public sealed class Paged : IPaged
{
/// <summary>
/// 页面数量
/// </summary>
public long PageCount { get; set; }
/// <summary>
/// 页面大小
/// </summary>
public int PageSize { get; set; }
/// <summary>
/// 返回结果
/// </summary>
public object Data { get; set; }
}

7
src/Easy.Result/Easy/IEntity.cs

@ -1,7 +0,0 @@
namespace Easy.Result;
public interface IEntity
{
public long Id { get; set; }
}

8
src/Easy.Result/Easy/IModel.cs

@ -1,8 +0,0 @@
using AutoMapper;
using Easy.Result.Common;
namespace Easy.Result;
public interface IModel
{
}

19
src/Easy.Result/Easy/Result/ApiResult.cs

@ -1,11 +1,11 @@
using Easy.Result.Extensions;
using Easy.Extensions;
namespace Easy.Result;
/// <summary>
/// ApiResult
/// </summary>
public class ApiResult : IModel
public class ApiResult
{
public ApiResult() { }
/// <summary>
@ -21,17 +21,26 @@ public class ApiResult : IModel
{
return Value(value).SUCCESS();
}
public static ApiResultValues<TValue> ValueSuccess<TValue>(List<TValue> value)
public static ApiResultValues<TValue> ValuesSuccess<TValue>(List<TValue> value)
{
return Value(value).SUCCESS();
return Values(value).SUCCESS();
}
public static ApiResultPaged<TValue> ValuesPagedSuccess<TValue>(List<TValue> value)
{
return ValuePaged(value).SUCCESS();
}
public static ApiResultValue<TValue> Value<TValue>(TValue value)
{
return new ApiResultValue<TValue>(value);
}
public static ApiResultValues<TValue> Value<TValue>(List<TValue> value)
public static ApiResultValues<TValue> Values<TValue>(List<TValue> value)
{
return new ApiResultValues<TValue>(value);
}
public static ApiResultPaged<TValue> ValuePaged<TValue>(List<TValue> value)
{
return new ApiResultPaged<TValue>(value);
}
}

11
src/Easy.Result/Easy/Result/ApiResultPaged.cs

@ -1,8 +1,12 @@
namespace Easy.Result;
public class ApiResultPaged<TSource> : ApiResult
public class ApiResultPaged<TValue> : ApiResultValues<TValue>
{
public ApiResultPaged() { }
public ApiResultPaged(List<TValue> value)
{
Results = value;
}
/// <summary>
/// 页面数量
/// </summary>
@ -11,8 +15,5 @@ public class ApiResultPaged<TSource> : ApiResult
/// 页面大小
/// </summary>
public int PageSize { get; set; }
/// <summary>
/// 返回结果
/// </summary>
public List<TSource> Result { get; set; }
}

7
src/Easy.Result/Easy/Result/ApiResultValues.cs

@ -5,7 +5,10 @@ public class ApiResultValues<TValue> : ApiResult
public ApiResultValues() { }
public ApiResultValues(List<TValue> value)
{
Result = value;
Results = value;
}
public List<TValue> Result { get; set; }
/// <summary>
/// 返回结果
/// </summary>
public List<TValue> Results { get; set; }
}

9
src/Easy.Uow/Easy/Aop/UowProxy.cs

@ -1,12 +1,5 @@
using Easy.Uow;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace Easy.Aop;
@ -33,7 +26,7 @@ public class UowProxy : IAsyncActionFilter
{
await UnitOfWork.RollbackAsync();
}
catch
catch
{
throw ex;
}

5
src/Easy.Uow/Easy/Extensions/ServiceCollectionServiceExtensions.cs

@ -1,16 +1,15 @@
using Easy.Aop;
using Easy.Realization;
using Easy.Uow;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
namespace Easy.Extensions;
public static class ServiceCollectionServiceExtensions
{
/// <summary>
public static IServiceCollection AddUow(this IServiceCollection services)
{
services.AddScoped<IUnitOfWork>(o => new UnitOfWork(o.GetService<DbContext>()));
services.AddScoped<IUnitOfWork, UnitOfWork>();
services.Configure<MvcOptions>(options =>
{
options.Filters.Add<UowProxy>();

6
src/Easy.Uow/Easy/Uow/UnitOfWork.cs → src/Easy.Uow/Easy/Realization/UnitOfWork.cs

@ -1,7 +1,8 @@
using Microsoft.EntityFrameworkCore;
using Easy.Uow;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Storage;
namespace Easy.Uow;
namespace Easy.Realization;
public class UnitOfWork : IAsyncDisposable, IUnitOfWork
{
@ -36,5 +37,6 @@ public class UnitOfWork : IAsyncDisposable, IUnitOfWork
{
await Transaction.DisposeAsync();
await DbContext.DisposeAsync();
GC.SuppressFinalize(this);
}
}

3
test/WebApplication/GraphDbContext.cs

@ -1,5 +1,4 @@
using Microsoft.EntityFrameworkCore;
using System.Diagnostics.CodeAnalysis;
namespace EFCore.BulkExtensions.Tests.ShadowProperties
{
@ -13,7 +12,7 @@ namespace EFCore.BulkExtensions.Tests.ShadowProperties
{
base.OnModelCreating(modelBuilder);
}
}

0
src/Easy.Result/Easy/PagingRequest.cs → test/WebApplication/PagingRequest.cs

Loading…
Cancel
Save