Example #1
0
        public void find_variables_returns_all_the_set_arguments_too()
        {
            var age   = Variable.For <int>("age");
            var count = Variable.For <int>("count");

            var name = Variable.For <string>();

            var variables = new StubMethodVariables();

            //variables.Store(age);
            variables.Store(count);
            variables.Store(name);

            var @call = MethodCall.For <MethodCallTarget>(x => x.DoSomething(0, 0, null));

            @call.IsLocal = true;
            @call.TrySetArgument("age", age).ShouldBeTrue();

            var found = @call.FindVariables(variables).ToArray();

            found.ShouldContain(age);
            found.ShouldContain(count);
            found.ShouldContain(name);
        }
Example #2
0
        public void no_return_variable_on_void_method()
        {
            var @call = MethodCall.For <MethodCallTarget>(x => x.Go(null));

            @call.ReturnVariable.ShouldBeNull();
        }
Example #3
0
        public void Apply(HandlerChain chain, ISagaPersistenceFrameProvider sagaPersistenceFrameProvider, IContainer container)
        {
            if (sagaPersistenceFrameProvider == null)
            {
                throw new InvalidOperationException("No saga persistence strategy is registered.");
            }

            var sagaStateType = DetermineSagaStateType(chain);
            var sagaIdType    = sagaPersistenceFrameProvider.DetermineSagaIdType(sagaStateType);

            var sagaHandler = chain.Handlers.FirstOrDefault(x => x.HandlerType.Closes(typeof(StatefulSagaOf <>)));

            var existence = DetermineExistence(sagaHandler.As <HandlerCall>());


            Variable sagaIdVariable = null;

            if (existence == SagaStateExistence.Existing)
            {
                var identityMethod = sagaHandler
                                     .HandlerType
                                     .GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static)
                                     .Where(x => x.Name == IdentityMethodName && x.ReturnType == sagaIdType)
                                     .FirstOrDefault(x => x.GetParameters().Any(p => p.ParameterType == chain.MessageType));

                var sagaId = ChooseSagaIdProperty(chain.MessageType);

                sagaIdVariable = createSagaIdVariable(sagaHandler.HandlerType, chain.MessageType, sagaId,
                                                      identityMethod, sagaIdType);


                chain.Middleware.Add(sagaIdVariable.Creator);
            }


            var existingState = sagaHandler.Creates.FirstOrDefault(x => x.VariableType == sagaStateType);

            // Tells the handler chain codegen to not use this as a cascading message
            existingState?.Properties.Add(HandlerChain.NotCascading, true);

            var persistenceFrame = sagaPersistenceFrameProvider.DeterminePersistenceFrame(container, chain, sagaHandler, existence, ref sagaIdVariable,
                                                                                          sagaStateType, existingState, out existingState);

            if (persistenceFrame != null)
            {
                chain.Middleware.Add(persistenceFrame);
            }

            if (existence == SagaStateExistence.Existing)
            {
                chain.Middleware.Add(new AssertSagaStateExistsFrame(existingState, sagaIdVariable));
            }

            var enlistInSagaId = MethodCall.For <IMessageContext>(x => x.EnlistInSaga(null));

            enlistInSagaId.Arguments[0] = sagaIdVariable;
            chain.Postprocessors.Add(enlistInSagaId);


            var storeOrDeleteFrame =
                sagaPersistenceFrameProvider.DetermineStoreOrDeleteFrame(container, chain, sagaHandler, existingState, sagaHandler.HandlerType);

            chain.Postprocessors.Add(storeOrDeleteFrame);
        }
Example #4
0
 public void default_disposal_mode_is_using()
 {
     MethodCall.For <MethodCallTarget>(x => x.Throw(null))
     .DisposalMode.ShouldBe(DisposalMode.UsingBlock);
 }
Example #5
0
 public void SetupCall()
 {
     theCall = MethodCall.For <MethodTarget>(x => x.ReturnTuple());
 }
        /// <inheritdoc />
        public void Build(MiddlewareBuilderContext context)
        {
            var runNowCall = MethodCall.For <IBackgroundTaskScheduler>(s => s.RunNowAsync());

            context.AppendFrames(runNowCall);
        }
Example #7
0
 public MethodCall Method(Expression <Action <T> > expression)
 {
     return(MethodCall.For(expression));
 }