TransactionInterceptor.cs 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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. using System.Data;
  9. namespace Admin.Core.Aop
  10. {
  11. public class TransactionInterceptor : IInterceptor
  12. {
  13. IUnitOfWork _unitOfWork;
  14. private readonly UnitOfWorkManager _unitOfWorkManager;
  15. public TransactionInterceptor(UnitOfWorkManager unitOfWorkManager)
  16. {
  17. _unitOfWorkManager = unitOfWorkManager;
  18. }
  19. public async void Intercept(IInvocation invocation)
  20. {
  21. var method = invocation.MethodInvocationTarget ?? invocation.Method;
  22. if (method.HasAttribute<TransactionAttribute>())
  23. {
  24. try
  25. {
  26. var transaction = method.GetAttribute<TransactionAttribute>();
  27. _unitOfWork = _unitOfWorkManager.Begin(transaction.Propagation, transaction.IsolationLevel);
  28. invocation.Proceed();
  29. if (method.IsAsync())
  30. {
  31. if (invocation.Method.ReturnType == typeof(Task))
  32. {
  33. await (Task)invocation.ReturnValue;
  34. _unitOfWork.Commit();
  35. }
  36. else
  37. {
  38. AopHelper.CallGenericMethod(
  39. invocation,
  40. res =>
  41. {
  42. if (res == null)
  43. {
  44. return;
  45. }
  46. var responseOutput = res as IResponseOutput;
  47. if (responseOutput != null && !responseOutput.Success)
  48. {
  49. _unitOfWork.Rollback();
  50. }
  51. _unitOfWork.Commit();
  52. },
  53. ex =>
  54. {
  55. _unitOfWork.Rollback();
  56. });
  57. }
  58. }
  59. else
  60. {
  61. if (invocation.Method.ReturnType != typeof(void))
  62. {
  63. var responseOutput = invocation.ReturnValue as Task<IResponseOutput>;
  64. if (responseOutput != null && !responseOutput.Result.Success)
  65. {
  66. _unitOfWork.Rollback();
  67. }
  68. _unitOfWork.Commit();
  69. }
  70. }
  71. }
  72. catch (Exception ex)
  73. {
  74. _unitOfWork.Rollback();
  75. throw ex;
  76. }
  77. }
  78. else
  79. {
  80. invocation.Proceed();
  81. }
  82. }
  83. }
  84. }