Ejemplo n.º 1
0
 public SagaContext(SagaCollaborator sagaCollaborator,
                    ILogger logger)
 {
     this._sagaCollaborator  = sagaCollaborator;
     this._sagaDataConverter = SagaGlobal.CurrentSagaDataConverter;
     this._sagaResolver      = SagaGlobal.CurrentSagaResolver;
     this._logger            = logger;
     this._sagaSession       = null;
 }
Ejemplo n.º 2
0
        public SimpleSaga(ILogger logger, ISagaResolver sagaResolver)
        {
            this._logger       = logger;
            this._sagaResolver = sagaResolver;
            // saga data types改成在这里静态方法注册,把FormType注册,用来找到所有的saga data types
            SagaGlobal.BindSagaDataType(typeof(FormType));

            AutoBindBranchServices();
        }
Ejemplo n.º 3
0
 public CollaboratorSagaWorker(ILogger <CollaboratorSagaWorker> logger,
                               SagaCollaborator sagaCollaborator,
                               ISagaResolver branchServiceResolver,
                               ISagaDataConverter sagaDataConverter)
 {
     this._logger                = logger;
     this._sagaCollaborator      = sagaCollaborator;
     this._branchServiceResolver = branchServiceResolver;
     this._sagaDataConverter     = sagaDataConverter;
 }
Ejemplo n.º 4
0
 public SagaSession(string xid,
                    SagaCollaborator sagaCollaborator,
                    ISagaDataConverter sagaDataConverter,
                    ISagaResolver sagaResolver,
                    ILogger logger)
 {
     this._xid = xid;
     this._sagaCollaborator  = sagaCollaborator;
     this._sagaDataConverter = sagaDataConverter;
     this._sagaResolver      = sagaResolver;
     this._logger            = logger;
 }
Ejemplo n.º 5
0
 public OrderController(ILogger <OrderController> logger,
                        ICreateOrderSaga createOrderSaga,
                        CreateOrderSaga realCreateOrderSaga,
                        OrderServiceImpl orderService,
                        SagaCollaborator sagaCollaborator,
                        ISagaDataConverter sagaDataConverter,
                        ISagaResolver sagaResolver
                        )
 {
     this._logger              = logger;
     this._createOrderSaga     = createOrderSaga;
     this._realCreateOrderSaga = realCreateOrderSaga;
     this._orderService        = orderService;
     this._sagaCollaborator    = sagaCollaborator;
     this._sagaDataConverter   = sagaDataConverter;
     this._sagaResolver        = sagaResolver;
 }
Ejemplo n.º 6
0
        public CreateOrderSaga(
            /* SagaWorker sagaWorker, */
            GrpcClientsHolder grpcClientsHolder,
            /* 这里注入orderService真实业务对象而不是saga代理对象,是为了避免两次sagaSession.invokeAsync重复注册一段代码为2各branchId */
            OrderServiceImpl orderService,
            ISagaResolver sagaResolver,
            ILogger <CreateOrderSaga> logger)
            : base(logger, sagaResolver)
        {
            // this._sagaWorker = sagaWorker;
            this._grpcClientsHolder = grpcClientsHolder;
            this._orderService      = orderService;
            this._sagaResolver      = sagaResolver;
            this._logger            = logger;


            // 本saga中服务会自动注入reslver,额外的服务需要手动注入
            //_sagaResolver.BindBranch<CreateOrderSagaData>( _orderService.createOrder);
            //_sagaResolver.BindBranch<CreateOrderSagaData>(_orderService.cancelOrder);
            //_sagaResolver.BindBranch<CreateOrderSagaData>(_orderService.approveOrder);


            // 显示定义 sagaDefinition是可选的,如果使用saga server管理动态分支,则不需要显示定义sagaDefinition
            sagaDefinition = Step()
                             //.SetRemoteAction(createOrder)
                             //.WithCompensation(cancelOrder)
                             .SetRemoteAction(createOrder)
                             .Step()
                             .SetRemoteAction(reserveCustomer)
                             .WithCompensation(cancelReserveCustomer)
                             .Step()
                             .SetRemoteAction(addLockedBalanceToMerchant)
                             .WithCompensation(cancelAddLockedBalanceToMerchant)
                             .Step()
                             .SetRemoteAction(approveOrder)
                             .Step()
                             .SetRemoteAction(approveAddLockedBalanceToMerchant)
                             .Step()
                             .SetRemoteAction(addOrderHistory)
                             .WithCompensation(cancelOrderHistory)
                             .Build(this);
        }
Ejemplo n.º 7
0
        // saga的实现类的各满足要求的方法,以及compensable方法(如果还没注册过的话)自动BindBranch,
        // 这样避免具体实现类中手动写
        public static void AutoBindBranchServices <FormType>(
            object instance,
            ISagaResolver sagaResolver,
            ILogger logger
            ) where FormType : class, SagaData
        {
            var sagaTypeInfo = instance.GetType();
            var methods      = sagaTypeInfo.GetMethods();

            foreach (var method in methods)
            {
                if (!method.IsPublic)
                {
                    continue;
                }
                if (method.IsStatic)
                {
                    continue;
                }
                if (method.ReturnType != typeof(Task))
                {
                    continue;
                }
                var methodParams = method.GetParameters();
                if (methodParams.Length != 1 || methodParams[0].ParameterType != typeof(FormType))
                {
                    continue;
                }
                Func <FormType, Task> func = delegate(FormType form)
                {
                    return(method.Invoke(instance, new object[] { form }) as Task);
                };
                // var action = DelegateBuilder.BuildDelegate<Func<FormType, Task>>(method, sagaTypeInfo);
                var serviceKey = sagaResolver.GetServiceKey(sagaTypeInfo, method.Name);
                sagaResolver.BindBranch <FormType>(serviceKey, func);
                logger.LogInformation($"saga resolver binded action {func}");
                // 如果有compensable注解,要求方法在本类中,并且是public方法
                var compensableAttr = Utils.MethodUtils.GetDeclaredAttribute <Compensable>(method, typeof(Compensable));
                if (compensableAttr != null)
                {
                    var compensableMethodName = compensableAttr.ActionName;
                    var compensableMethod     = Utils.MethodUtils.GetMethod(sagaTypeInfo, compensableMethodName);
                    if (compensableMethod == null)
                    {
                        throw new MethodAccessException($"Can't find compensable method {compensableMethodName} in saga type {sagaTypeInfo.FullName}");
                    }
                    if (!compensableMethod.IsPublic)
                    {
                        throw new MethodAccessException($"compensable method {compensableMethodName} in saga type {sagaTypeInfo.FullName} must be public");
                    }
                    if (compensableMethod.IsStatic)
                    {
                        throw new MethodAccessException($"compensable method {compensableMethodName} in saga type {sagaTypeInfo.FullName} can't be static");
                    }
                    if (compensableMethod.ReturnType != typeof(Task))
                    {
                        throw new MethodAccessException($"compensable method {compensableMethodName} in saga type {sagaTypeInfo.FullName} has invalid return type");
                    }
                    var compensableMethodParams = compensableMethod.GetParameters();
                    if (compensableMethodParams.Length != 1 || compensableMethodParams[0].ParameterType != typeof(FormType))
                    {
                        throw new MethodAccessException($"compensable method {compensableMethodName} in saga type {sagaTypeInfo.FullName} has invalid parameters types");
                    }
                }
            }
        }