public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { if (!context.ActionDescriptor.IsControllerAction()) { await next(); return; } var unitOfWorkAttr = _unitOfWorkDefaultOptions .GetUnitOfWorkAttributeOrNull(context.ActionDescriptor.GetMethodInfo()) ?? _aspnetCoreConfiguration.DefaultUnitOfWorkAttribute; if (unitOfWorkAttr.IsDisabled) { await next(); return; } using (var uow = _unitOfWorkManager.Begin(unitOfWorkAttr.CreateOptions())) { var result = await next(); if (result.Exception == null || result.ExceptionHandled) { await uow.CompleteAsync(); } } }
public void OnActionExecuting(ActionExecutingContext filterContext) { if (filterContext.IsChildAction) { return; } var methodInfo = filterContext.ActionDescriptor.GetMethodInfoOrNull(); if (methodInfo == null) { return; } var unitOfWorkAttr = _unitOfWorkDefaultOptions.GetUnitOfWorkAttributeOrNull(methodInfo) ?? _mvcConfiguration.DefaultUnitOfWorkAttribute; if (unitOfWorkAttr.IsDisabled) { return; } SetCurrentUow( filterContext.HttpContext, _unitOfWorkManager.Begin(unitOfWorkAttr.CreateOptions()) ); }
public void Intercept(IInvocation invocation) { MethodInfo method; try { method = invocation.MethodInvocationTarget; } catch { method = invocation.GetConcreteMethod(); } var unitOfWorkAttr = _unitOfWorkOptions.GetUnitOfWorkAttributeOrNull(method); if (unitOfWorkAttr == null || unitOfWorkAttr.IsDisabled) { invocation.Proceed(); return; } var options = unitOfWorkAttr.CreateOptions(); using (var uow = _unitOfWorkManager.Begin(options)) { invocation.Proceed(); uow.Complete(); } //using (var ts = new TransactionScope())//创建一个事务范围对象 //{ // invocation.Proceed();//执行被拦截的方法 // ts.Complete();//事务完成 //} }
/// <summary> /// Intercepts a method. /// </summary> /// <param name="invocation">Method invocation arguments</param> public void Intercept(IInvocation invocation) { MethodInfo method; try { method = invocation.MethodInvocationTarget; } catch { method = invocation.GetConcreteMethod(); } var unitOfWorkAttr = _unitOfWorkOptions.GetUnitOfWorkAttributeOrNull(method); if (unitOfWorkAttr == null || unitOfWorkAttr.IsDisabled) { //No need to a uow invocation.Proceed(); return; } //No current uow, run a new one PerformUow(invocation, unitOfWorkAttr.CreateOptions()); }
public async Task <HttpResponseMessage> ExecuteActionFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func <Task <HttpResponseMessage> > continuation) { var methodInfo = actionContext.ActionDescriptor.GetMethodInfoOrNull(); if (methodInfo == null) { return(await continuation()); } if (actionContext.ActionDescriptor.IsDynamicAbpAction()) { return(await continuation()); } //var unitOfWorkAttr = _unitOfWorkDefaultOptions.GetUnitOfWorkAttributeOrNull(methodInfo) ?? // _webApiConfiguration.DefaultUnitOfWorkAttribute; var unitOfWorkAttr = _unitOfWorkDefaultOptions.GetUnitOfWorkAttributeOrNull(methodInfo); if (unitOfWorkAttr.IsDisabled) { return(await continuation()); } using (var uow = _unitOfWorkManager.Begin(unitOfWorkAttr.CreateOptions())) { var result = await continuation(); await uow.CompleteAsync(); return(result); } }
/// <summary> /// action执行之前,增加工作单元包裹 /// </summary> /// <param name="filterContext"></param> public void OnActionExecuting(ActionExecutingContext filterContext) { // 非视图方法不增加工作单元 if (filterContext.IsChildAction) { return; } //获取方法的相关信息 var methodInfo = filterContext.ActionDescriptor.GetMethodInfoOrNull(); if (methodInfo == null) { return; } //判断该方法(或者其所属类)是否定义了UnitOfWorkAttribute var unitOfWorkAttr = _unitOfWorkDefaultOptions.GetUnitOfWorkAttributeOrNull(methodInfo) ?? _mvcConfiguration.DefaultUnitOfWorkAttribute; //该方法禁用了UnitOfWork,直接返回 if (unitOfWorkAttr.IsDisabled) { return; } //启用了UnitOfWork,则将请求上下文及该方法包裹在一个工作单元中 SetCurrentUow( filterContext.HttpContext, _unitOfWorkManager.Begin(unitOfWorkAttr.CreateOptions()) ); }
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { //不是控制器方法,直接调用该方法并返回,无需工作单元 if (!context.ActionDescriptor.IsControllerAction()) { await next(); return; } //获取方法或者所属类定义的工作单元,如果没有,给默认的工作单元实例 var unitOfWorkAttr = _unitOfWorkDefaultOptions .GetUnitOfWorkAttributeOrNull(context.ActionDescriptor.GetMethodInfo()) ?? _aspnetCoreConfiguration.DefaultUnitOfWorkAttribute; //未启用UOW的直接调用action,否则用UOW实例将action包裹 if (unitOfWorkAttr.IsDisabled) { await next(); return; } //自动将UOW特性解析成工作单元模块 using (var uow = _unitOfWorkManager.Begin(unitOfWorkAttr.CreateOptions())) { //2020年8月25日 疑问是:这里只有一个action,它要工作单元有什么用处?? var result = await next(); if (result.Exception == null || result.ExceptionHandled) { await uow.CompleteAsync(); } } }
public async Task OnPageHandlerExecutionAsync(PageHandlerExecutingContext context, PageHandlerExecutionDelegate next) { var unitOfWorkAttr = _unitOfWorkDefaultOptions .GetUnitOfWorkAttributeOrNull(context.HandlerMethod.MethodInfo) ?? _aspnetCoreConfiguration.DefaultUnitOfWorkAttribute; if (unitOfWorkAttr.IsDisabled) { await next(); return; } var uowOpts = new UnitOfWorkOptions { IsTransactional = unitOfWorkAttr.IsTransactional, IsolationLevel = unitOfWorkAttr.IsolationLevel, Timeout = unitOfWorkAttr.Timeout, Scope = unitOfWorkAttr.Scope }; using (var uow = _unitOfWorkManager.Begin(uowOpts)) { var result = await next(); if (result.Exception == null || result.ExceptionHandled) { await uow.CompleteAsync(); } } }
/// <summary> /// 截取一个方法。 /// </summary> /// <param name="invocation">方法调用参数</param> public void Intercept(IInvocation invocation) { MethodInfo method; try { method = invocation.MethodInvocationTarget; } catch { method = invocation.GetConcreteMethod(); } var unitOfWorkAttr = _unitOfWorkOptions.GetUnitOfWorkAttributeOrNull(method); if (unitOfWorkAttr == null || unitOfWorkAttr.IsDisabled) { //不需要UOW invocation.Proceed(); return; } //没有当前UOW,运行新的UOW PerformUow(invocation, unitOfWorkAttr.CreateOptions()); }
public override void InterceptSynchronous(IInvocation invocation) { var method = GetMethodInfo(invocation); var unitOfWorkAttr = _unitOfWorkOptions.GetUnitOfWorkAttributeOrNull(method); if (unitOfWorkAttr == null || unitOfWorkAttr.IsDisabled) { invocation.Proceed(); return; } using (var uow = _unitOfWorkManager.Begin(unitOfWorkAttr.CreateOptions())) { invocation.Proceed(); uow.Complete(); } }