public void OnActionExecuting(ActionExecutingContext filterContext) { if (filterContext.IsChildAction) { return; } var methodInfo = filterContext.ActionDescriptor.GetMethodInfoOrNull(); if (methodInfo == null) { return; } var unitOfWorkAttr = UnitOfWorkAttribute.GetUnitOfWorkAttributeOrNull(methodInfo) ?? _configuration.DefaultUnitOfWorkAttribute; if (unitOfWorkAttr.IsDisabled) { return; } SetCurrentUow( filterContext.HttpContext, _unitOfWorkManager.Begin(unitOfWorkAttr.CreateOptions()) ); }
public void Intercept(IInvocation invocation) { //常规用法 //Console.WriteLine("猫吃东西之前"); //invocation.Proceed(); //Console.WriteLine("猫吃东西之后"); //高级用法 //Console.WriteLine("喂猫吃东西"); //invocation.Method.Invoke(_cat,invocation.Arguments);//调用Cat的指定方法 //高级用法 对方法特性识别,拦截到方法级别 测试失败 Console.WriteLine("喂猫吃东西"); MethodInfo methodInfo = invocation.MethodInvocationTarget; if (methodInfo == null) { methodInfo = invocation.Method; } UnitOfWorkAttribute transaction = methodInfo.GetCustomAttributes <UnitOfWorkAttribute>(true).FirstOrDefault(); if (transaction != null) { invocation.Proceed(); } }
public static bool IsUnitOfWorkMethod([NotNull] MethodInfo methodInfo, [CanBeNull] out UnitOfWorkAttribute unitOfWorkAttribute) { Check.NotNull(methodInfo, nameof(methodInfo)); //Method declaration var attrs = methodInfo.GetCustomAttributes(true).OfType <UnitOfWorkAttribute>().ToArray(); if (attrs.Any()) { unitOfWorkAttribute = attrs.First(); return(!unitOfWorkAttribute.IsDisabled); } if (methodInfo.DeclaringType != null) { //Class declaration attrs = methodInfo.DeclaringType.GetTypeInfo().GetCustomAttributes(true).OfType <UnitOfWorkAttribute>().ToArray(); if (attrs.Any()) { unitOfWorkAttribute = attrs.First(); return(!unitOfWorkAttribute.IsDisabled); } //Conventional classes if (typeof(IUnitOfWorkEnabled).GetTypeInfo().IsAssignableFrom(methodInfo.DeclaringType)) { unitOfWorkAttribute = null; return(true); } } unitOfWorkAttribute = null; return(false); }
public AbpAspNetCoreConfiguration() { DefaultWrapResultAttribute = new WrapResultAttribute(); DefaultUnitOfWorkAttribute = new UnitOfWorkAttribute(); ServiceControllerSettings = new List <AbpServiceControllerSetting>(); IsValidationEnabledForControllers = true; }
public static bool IsUnitOfWorkMethod([NotNull] MethodInfo methodInfo, [CanBeNull] out UnitOfWorkAttribute unitOfWorkAttribute) { //Method declaration var attrs = methodInfo.GetCustomAttributes(true).OfType <UnitOfWorkAttribute>().ToArray(); if (attrs.Any()) { unitOfWorkAttribute = attrs.First(); return(!unitOfWorkAttribute.IsDisabled); } if (methodInfo.DeclaringType != null) { //Class declaration attrs = methodInfo.DeclaringType.GetTypeInfo().GetCustomAttributes(true).OfType <UnitOfWorkAttribute>().ToArray(); if (attrs.Any()) { unitOfWorkAttribute = attrs.First(); return(!unitOfWorkAttribute.IsDisabled); } } unitOfWorkAttribute = null; return(false); }
public AbpWebApiConfiguration() { HttpConfiguration = GlobalConfiguration.Configuration; DefaultUnitOfWorkAttribute = new UnitOfWorkAttribute(); DefaultWrapResultAttribute = new WrapResultAttribute(false); DefaultDynamicApiWrapResultAttribute = new WrapResultAttribute(); }
public AbpMvcConfiguration() { DefaultUnitOfWorkAttribute = new UnitOfWorkAttribute(); DefaultWrapResultAttribute = new WrapResultAttribute(); IsValidationEnabledForControllers = true; IsAutomaticAntiForgeryValidationEnabled = true; }
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 = UnitOfWorkAttribute.GetUnitOfWorkAttributeOrNull(methodInfo) ?? _configuration.DefaultUnitOfWorkAttribute; if (unitOfWorkAttr.IsDisabled) { return(await continuation()); } using (var uow = _unitOfWorkManager.Begin(unitOfWorkAttr.CreateOptions())) { var result = await continuation(); await uow.CompleteAsync(); return(result); } }
public AbpWebApiConfiguration() { HttpConfiguration = GlobalConfiguration.Configuration; DefaultUnitOfWorkAttribute = new UnitOfWorkAttribute(); DefaultWrapResultAttribute = new WrapResultAttribute(false); DefaultDynamicApiWrapResultAttribute = new WrapResultAttribute(); IsValidationEnabledForControllers = true; }
/// <summary> /// 创建工作单元选项 /// </summary> internal static UnitOfWorkOptions CreateOptions(this UnitOfWorkAttribute uow) { return(new UnitOfWorkOptions() { IsTransactional = uow.IsTransactional, IsolationLevel = uow.IsolationLevel, Timeout = uow.Timeout, Scope = uow.Scope }); }
public AbpAspNetCoreConfiguration() { DefaultWrapResultAttribute = new WrapResultAttribute(); DefaultUnitOfWorkAttribute = new UnitOfWorkAttribute(); ControllerAssemblySettings = new ControllerAssemblySettingList(); FormBodyBindingIgnoredTypes = new List <Type>(); IsValidationEnabledForControllers = true; SetNoCacheForAjaxResponses = true; IsAuditingEnabled = true; }
public AbpWebApiConfiguration() { HttpConfiguration = GlobalConfiguration.Configuration; DefaultUnitOfWorkAttribute = new UnitOfWorkAttribute(); DefaultWrapResultAttribute = new WrapResultAttribute(false); DefaultDynamicApiWrapResultAttribute = new WrapResultAttribute(); ResultWrappingIgnoreUrls = new List <string>(); IsValidationEnabledForControllers = true; IsAutomaticAntiForgeryValidationEnabled = true; SetNoCacheForAllResponses = true; }
public void Test_Should_Commit_if_there_is_no_exception() { var uowAttr = new UnitOfWorkAttribute(); var mockUoW = new Mock <IUnitOfWork>(); mockUoW.Setup(u => u.Commit()).Verifiable(); uowAttr.UnitOfWork = mockUoW.Object; uowAttr.OnActionExecuted(new ActionExecutedContext()); mockUoW.Verify(); }
public CodeZeroAspNetCoreConfiguration() { DefaultWrapResultAttribute = new WrapResultAttribute(); DefaultClientCacheAttribute = new NoClientCacheAttribute(false); DefaultUnitOfWorkAttribute = new UnitOfWorkAttribute(); ControllerAssemblySettings = new ControllerAssemblySettingList(); FormBodyBindingIgnoredTypes = new List <Type>(); RouteConfiguration = new List <Action <IRouteBuilder> >(); IsValidationEnabledForControllers = true; SetNoCacheForAjaxResponses = true; IsAuditingEnabled = true; }
public void UnitOfWorkFilter_DbConcurrencyException() { UnitOfWorkAttribute attribute = new UnitOfWorkAttribute(); var modelState = new ModelStateDictionary(); var actionContext = new ActionContext( new Mock <HttpContext>().Object, new Mock <RouteData>().Object, new Mock <ActionDescriptor>().Object, modelState ); var parameters = new Dictionary <string, object>(); parameters["item"] = "not null"; var transactionCoordinatorMock = new Mock <ITransactionCoordinator>(); var updateEntry = new Mock <IUpdateEntry>(); transactionCoordinatorMock.Setup(x => x.CommitTransaction()).Throws(new DbUpdateConcurrencyException("error", new List <IUpdateEntry>() { updateEntry.Object })); var dbcontextMock = new Mock <DbContext>(); ApiHealthController controller = new ApiHealthController(new Mock <ApiSettings>().Object, new Mock <ILogger <ApiHealthController> >().Object, transactionCoordinatorMock.Object, dbcontextMock.Object); var actionExecutingContext = new ActionExecutingContext( actionContext, new List <IFilterMetadata>(), parameters, controller ); var actionExecutedContext = new ActionExecutedContext( actionContext, new List <IFilterMetadata>(), controller ); attribute.OnActionExecuting(actionExecutingContext); transactionCoordinatorMock.Verify(x => x.BeginTransaction()); Action execute = () => { attribute.OnActionExecuted(actionExecutedContext); }; execute.Should().Throw <DbUpdateConcurrencyException>(); }
public AbpAspNetCoreConfiguration() { DefaultWrapResultAttribute = new WrapResultAttribute(); DefaultClientCacheAttribute = new NoClientCacheAttribute(false); DefaultUnitOfWorkAttribute = new UnitOfWorkAttribute(); ControllerAssemblySettings = new ControllerAssemblySettingList(); FormBodyBindingIgnoredTypes = new List <Type>(); EndpointConfiguration = new List <Action <IEndpointRouteBuilder> >(); IsValidationEnabledForControllers = true; SetNoCacheForAjaxResponses = true; IsAuditingEnabled = true; UseMvcDateTimeFormatForAppServices = false; }
public void Test_Should_not_commit_if_there_is_Exception() { var uowAttr = new UnitOfWorkAttribute(); var mockUoW = new Mock <IUnitOfWork>(); mockUoW.Setup(u => u.Commit()).Throws <InvalidOperationException>(); uowAttr.UnitOfWork = mockUoW.Object; uowAttr.OnActionExecuted(new ActionExecutedContext() { Exception = new Exception() }); }
private UnitOfWorkOptions CreateOptions(ActionExecutingContext context, UnitOfWorkAttribute unitOfWorkAttribute) { var unitOfWorkOptions = _defaultUnitOfWorkOptions.Clone(); unitOfWorkAttribute?.SetOptions(unitOfWorkOptions); if (unitOfWorkAttribute?.IsTransactional == null) { unitOfWorkOptions.IsTransactional = !string.Equals(context.HttpContext.Request.Method, HttpMethod.Get.Method, StringComparison.OrdinalIgnoreCase); } return(unitOfWorkOptions); }
/// <summary> /// 获取Api函数列表 /// </summary> /// <returns></returns> public virtual IEnumerable <ApplicationServiceApiMethodInfo> GetApiMethods() { var typeInfo = GetType().GetTypeInfo(); var methods = typeInfo.GetMethods( BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance); foreach (var method in methods) { if (method.IsSpecialName) { continue; } if (method.ReturnType == typeof(void)) { continue; } // 创建函数委托 // 如果函数未标记[UnitOfWork]则手动包装该函数 var action = this.BuildActionDelegate(method); if (method.GetCustomAttribute <UnitOfWorkAttribute>() == null) { action = new UnitOfWorkAttribute().Filter(action); } // 包装过滤器 var filterAttributes = method.GetCustomAttributes <ActionFilterAttribute>(); foreach (var filterAttribute in filterAttributes) { action = filterAttribute.Filter(action); } // 请求时自动设置当前的Api信息 ApplicationServiceApiMethodInfo info = null; var innerAction = action; action = () => { Context.SetApiMethodInfo(info); return(innerAction()); }; // 返回函数信息 info = new ApplicationServiceApiMethodInfo( method.ReturnType, method.Name, $"{UrlBase}/{method.Name}", method.FastGetCustomAttributes(typeof(Attribute), true).OfType <Attribute>(), method.GetParameters().Select(p => new ApplicationServiceApiParameterInfo( p.ParameterType, p.Name, p.GetCustomAttributes(typeof(Attribute), true).OfType <Attribute>())), action); yield return(info); } }
private AbpUnitOfWorkOptions CreateOptions(ActionExecutingContext context, UnitOfWorkAttribute unitOfWorkAttribute) { var options = new AbpUnitOfWorkOptions(); unitOfWorkAttribute?.SetOptions(options); if (unitOfWorkAttribute?.IsTransactional == null) { options.IsTransactional = _defaultOptions.CalculateIsTransactional( autoValue: !string.Equals(context.HttpContext.Request.Method, HttpMethod.Get.Method, StringComparison.OrdinalIgnoreCase) ); } return(options); }
private AbpUnitOfWorkOptions CreateOptions(PageHandlerExecutingContext context, UnitOfWorkAttribute unitOfWorkAttribute) { var options = new AbpUnitOfWorkOptions(); unitOfWorkAttribute?.SetOptions(options); if (unitOfWorkAttribute?.IsTransactional == null) { var abpUnitOfWorkDefaultOptions = context.GetRequiredService <IOptions <AbpUnitOfWorkDefaultOptions> >().Value; options.IsTransactional = abpUnitOfWorkDefaultOptions.CalculateIsTransactional( autoValue: !string.Equals(context.HttpContext.Request.Method, HttpMethod.Get.Method, StringComparison.OrdinalIgnoreCase) ); } return(options); }
public void UnitOfWorkFilter_Rollback() { UnitOfWorkAttribute attribute = new UnitOfWorkAttribute(); var modelState = new ModelStateDictionary(); var actionContext = new ActionContext( new Mock <HttpContext>().Object, new Mock <RouteData>().Object, new Mock <ActionDescriptor>().Object, modelState ); var parameters = new Dictionary <string, object>(); parameters["item"] = "not null"; var transactionCoordinatorMock = new Mock <ITransactionCoordinator>(); var updateEntry = new Mock <IUpdateEntry>(); transactionCoordinatorMock.Setup(x => x.RollbackTransaction()); var dbcontextMock = new Mock <DbContext>(); ApiHealthController controller = new ApiHealthController(new Mock <ApiSettings>().Object, new Mock <ILogger <ApiHealthController> >().Object, transactionCoordinatorMock.Object, dbcontextMock.Object); var actionExecutingContext = new ActionExecutingContext( actionContext, new List <IFilterMetadata>(), parameters, controller ); var actionExecutedContext = new ActionExecutedContext( actionContext, new List <IFilterMetadata>(), controller ); actionExecutedContext.Exception = new Exception(); attribute.OnActionExecuting(actionExecutingContext); transactionCoordinatorMock.Verify(x => x.BeginTransaction()); attribute.OnActionExecuted(actionExecutedContext); transactionCoordinatorMock.Verify(x => x.RollbackTransaction()); }
/// <summary> /// 添加AspNet Core UnitOfWork /// </summary> /// <param name="services"></param> /// <returns></returns> public static IServiceCollection AddRivenAspNetCoreUow(this IServiceCollection services, Action <UnitOfWorkAttribute> configurationDefaultUowAttr = null) { services.AddTransient <IAspNetCoreUnitOfWorkHandler, AspNetCoreUowHandler>(); if (configurationDefaultUowAttr != null) { var unitOfWorkAttribute = new UnitOfWorkAttribute(); configurationDefaultUowAttr.Invoke(unitOfWorkAttribute); services.AddSingleton <UnitOfWorkAttribute>(unitOfWorkAttribute); } else { services.AddSingleton <UnitOfWorkAttribute>(); } return(services); }
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { var unitOfWorkAttr = UnitOfWorkAttribute .GetUnitOfWorkAttributeOrNull(context.ActionDescriptor.GetMethodInfo()) ?? _configuration.DefaultUnitOfWorkAttribute; if (unitOfWorkAttr.IsDisabled) { await next(); return; } using (var uow = _unitOfWorkManager.Begin(unitOfWorkAttr.CreateOptions())) { await next(); await uow.CompleteAsync(); } }
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { var unitOfWorkAttr = UnitOfWorkAttribute .GetUnitOfWorkAttributeOrNull(context.ActionDescriptor.GetMethodInfo()) ?? new UnitOfWorkAttribute(); //TODO: GetUnitOfWorkAttributeOrNull also checks for conventional classes, which makes this duplicate if (unitOfWorkAttr.IsDisabled) { await next(); return; } using (var uow = _unitOfWorkManager.Begin(unitOfWorkAttr.CreateOptions())) { await next(); await uow.CompleteAsync(); } }
/// <summary> /// Intercepts a method. /// </summary> /// <param name="invocation">Method invocation arguments</param> public void Intercept(IInvocation invocation) { if (_unitOfWorkManager.Current != null) { //Continue with current uow invocation.Proceed(); return; } var unitOfWorkAttr = UnitOfWorkAttribute.GetUnitOfWorkAttributeOrNull(invocation.MethodInvocationTarget); 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 UnitOfWork Create(MethodInfo y) { UnitOfWorkAttribute uowAttribute = y.GetCustomAttribute <UnitOfWorkAttribute>(); IDictionary <string, object> uowAttributeData = y.GetCustomAttributesData() .Where(z => z.AttributeType == typeof(UnitOfWorkAttribute)) .Select(y => y.NamedArguments .ToDictionary( keySelector: keySelector => keySelector.MemberName, elementSelector: elementSelector => elementSelector.TypedValue.Value ) ) .FirstOrDefault(); if (uowAttribute is null) { throw new ArgumentException($"Method must be decorated with [{nameof(UnitOfWorkAttribute)}]."); } return(new UnitOfWork( ownerMethodInfo: y, attributeData: uowAttributeData)); }
public void Intercept(IInvocation invocation) { MethodInfo methodInfo = invocation.MethodInvocationTarget; if (methodInfo == null) { methodInfo = invocation.Method; } UnitOfWorkAttribute transaction = methodInfo.GetCustomAttributes <UnitOfWorkAttribute>(true).FirstOrDefault(); //如果标记了 [UnitOfWork],并且不在事务嵌套中。 if (transaction != null && dBContext.Committed) { //开启事务 dBContext.BeginTransaction(); try { //事务包裹 查询语句 //https://github.com/mysql-net/MySqlConnector/issues/405 invocation.Proceed(); //提交事务 dBContext.CommitTransaction(); } catch (Exception ex) { //回滚 dBContext.RollBackTransaction(); throw; } } else { //如果没有标记[UnitOfWork],直接执行方法 invocation.Proceed(); } }
public AbpMvcConfiguration() { DefaultUnitOfWorkAttribute = new UnitOfWorkAttribute(); DefaultWrapResultAttribute = new WrapResultAttribute(); }
private AbpUnitOfWorkOptions CreateOptions(IServiceProvider serviceProvider, IAbpMethodInvocation invocation, [CanBeNull] UnitOfWorkAttribute unitOfWorkAttribute) { var options = new AbpUnitOfWorkOptions(); unitOfWorkAttribute?.SetOptions(options); if (unitOfWorkAttribute?.IsTransactional == null) { var defaultOptions = serviceProvider.GetRequiredService <IOptions <AbpUnitOfWorkDefaultOptions> >().Value; options.IsTransactional = defaultOptions.CalculateIsTransactional( autoValue: serviceProvider.GetRequiredService <IUnitOfWorkTransactionBehaviourProvider>().IsTransactional ?? !invocation.Method.Name.StartsWith("Get", StringComparison.InvariantCultureIgnoreCase) ); } return(options); }