コード例 #1
0
        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())
                );
        }
コード例 #2
0
        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();
            }
        }
コード例 #3
0
        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);
        }
コード例 #4
0
 public AbpAspNetCoreConfiguration()
 {
     DefaultWrapResultAttribute        = new WrapResultAttribute();
     DefaultUnitOfWorkAttribute        = new UnitOfWorkAttribute();
     ServiceControllerSettings         = new List <AbpServiceControllerSetting>();
     IsValidationEnabledForControllers = true;
 }
コード例 #5
0
        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);
        }
コード例 #6
0
 public AbpWebApiConfiguration()
 {
     HttpConfiguration                    = GlobalConfiguration.Configuration;
     DefaultUnitOfWorkAttribute           = new UnitOfWorkAttribute();
     DefaultWrapResultAttribute           = new WrapResultAttribute(false);
     DefaultDynamicApiWrapResultAttribute = new WrapResultAttribute();
 }
コード例 #7
0
 public AbpMvcConfiguration()
 {
     DefaultUnitOfWorkAttribute              = new UnitOfWorkAttribute();
     DefaultWrapResultAttribute              = new WrapResultAttribute();
     IsValidationEnabledForControllers       = true;
     IsAutomaticAntiForgeryValidationEnabled = true;
 }
コード例 #8
0
        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);
            }
        }
コード例 #9
0
 public AbpWebApiConfiguration()
 {
     HttpConfiguration                    = GlobalConfiguration.Configuration;
     DefaultUnitOfWorkAttribute           = new UnitOfWorkAttribute();
     DefaultWrapResultAttribute           = new WrapResultAttribute(false);
     DefaultDynamicApiWrapResultAttribute = new WrapResultAttribute();
     IsValidationEnabledForControllers    = true;
 }
コード例 #10
0
 /// <summary>
 /// 创建工作单元选项
 /// </summary>
 internal static UnitOfWorkOptions CreateOptions(this UnitOfWorkAttribute uow)
 {
     return(new UnitOfWorkOptions()
     {
         IsTransactional = uow.IsTransactional,
         IsolationLevel = uow.IsolationLevel,
         Timeout = uow.Timeout,
         Scope = uow.Scope
     });
 }
コード例 #11
0
 public AbpAspNetCoreConfiguration()
 {
     DefaultWrapResultAttribute        = new WrapResultAttribute();
     DefaultUnitOfWorkAttribute        = new UnitOfWorkAttribute();
     ControllerAssemblySettings        = new ControllerAssemblySettingList();
     FormBodyBindingIgnoredTypes       = new List <Type>();
     IsValidationEnabledForControllers = true;
     SetNoCacheForAjaxResponses        = true;
     IsAuditingEnabled = true;
 }
コード例 #12
0
 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;
 }
コード例 #13
0
        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();
        }
コード例 #14
0
 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;
 }
コード例 #15
0
        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>();
        }
コード例 #16
0
 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;
 }
コード例 #17
0
        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()
            });
        }
コード例 #18
0
ファイル: UowActionFilter.cs プロジェクト: XF1314/Xpress
        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);
        }
コード例 #19
0
        /// <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);
            }
        }
コード例 #20
0
ファイル: AbpUowActionFilter.cs プロジェクト: wenjie820/abp
        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);
        }
コード例 #21
0
    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);
    }
コード例 #22
0
        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());
        }
コード例 #23
0
        /// <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);
        }
コード例 #24
0
        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();
            }
        }
コード例 #25
0
        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();
            }
        }
コード例 #26
0
        /// <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());
        }
コード例 #27
0
        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));
        }
コード例 #28
0
        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();
            }
        }
コード例 #29
0
 public AbpMvcConfiguration()
 {
     DefaultUnitOfWorkAttribute = new UnitOfWorkAttribute();
     DefaultWrapResultAttribute = new WrapResultAttribute();
 }
コード例 #30
0
ファイル: UnitOfWorkInterceptor.cs プロジェクト: younes21/abp
    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);
    }