0
0

TransactionInterceptor.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. using System;
  2. using System.Threading.Tasks;
  3. using Castle.DynamicProxy;
  4. using FreeSql;
  5. using Admin.Core.Common;
  6. using Admin.Core.Extensions;
  7. using Admin.Core.Model.Output;
  8. namespace Admin.Core.Aop
  9. {
  10. public class TransactionInterceptor : IInterceptor
  11. {
  12. private readonly IUnitOfWork _unitOfWork;
  13. public TransactionInterceptor(IUnitOfWork unitOfWork)
  14. {
  15. _unitOfWork = unitOfWork;
  16. }
  17. public async void Intercept(IInvocation invocation)
  18. {
  19. var method = invocation.MethodInvocationTarget ?? invocation.Method;
  20. if (method.HasAttribute<TransactionAttribute>())
  21. {
  22. try
  23. {
  24. _unitOfWork.Open();
  25. invocation.Proceed();
  26. if (method.IsAsync())
  27. {
  28. if (invocation.Method.ReturnType == typeof(Task))
  29. {
  30. await (Task)invocation.ReturnValue;
  31. _unitOfWork.Commit();
  32. }
  33. else
  34. {
  35. AopHelper.CallGenericMethod(
  36. invocation,
  37. res =>
  38. {
  39. if (res == null)
  40. {
  41. return;
  42. }
  43. var responseOutput = res as IResponseOutput;
  44. if (responseOutput != null && !responseOutput.Success)
  45. {
  46. _unitOfWork.Rollback();
  47. }
  48. _unitOfWork.Commit();
  49. },
  50. ex =>
  51. {
  52. _unitOfWork.Rollback();
  53. });
  54. }
  55. }
  56. else
  57. {
  58. if (invocation.Method.ReturnType != typeof(void))
  59. {
  60. var responseOutput = invocation.ReturnValue as Task<IResponseOutput>;
  61. if (responseOutput != null && !responseOutput.Result.Success)
  62. {
  63. _unitOfWork.Rollback();
  64. }
  65. _unitOfWork.Commit();
  66. }
  67. }
  68. }
  69. catch (Exception ex)
  70. {
  71. _unitOfWork.Rollback();
  72. throw ex;
  73. }
  74. }
  75. else
  76. {
  77. invocation.Proceed();
  78. }
  79. }
  80. }
  81. }