static IEnumerable<object> ProcessContextInternal(this IKayakContext context, IKayakFrameworkBehavior behavior)
        {
            yield return context.Request.Begin();

            var info = new InvocationInfo();
            context.SetInvocationInfo(info);

            yield return behavior.Route(context);

            var failed = false;
            var auth = behavior.Authenticate(context);

            if (auth != null)
                yield return auth.Do(r => failed = r);

            if (!failed)
            {
                info.Target = Activator.CreateInstance(info.Method.DeclaringType);

                var parameterCount = info.Method.GetParameters().Length;
                info.Arguments = new object[parameterCount];

                yield return behavior.Bind(context);

                context.PerformInvocation();

                yield return behavior.Handle(context);
            }

            yield return context.Response.End();
        }
        void InvokeMethod(object target, string name)
        {
            var method = target.GetType().GetMethod(name);

            if (method == null)
                throw new Exception("Unknown method '" + name + "'");

            info = new InvocationInfo()
            {
                Target = target,
                Method = method,
                Arguments = arguments.ToArray()
            };

            SetUpMockBehaviorBind();

            mockContext.Object.PerformInvocation(mockBehavior.Object);
        }
        public void NullInfoTargetException()
        {
            mockContext.DefaultValue = DefaultValue.Mock;
            var mockRequest = Mock.Get(mockContext.Object.Request);
            mockRequest.Setup(r => r.Begin()).Returns(Observable.Empty<Unit>());

            SetUpMockBehaviorBind(Observable.Empty<InvocationInfo>());
            SetUpMockBehaviorInvoke();

            var mockTarget = new Mock<IBind>();
            info = new InvocationInfo();
            info.Method = mockTarget.Object.GetType().GetMethod("Bind0");

            mockContext.Object.PerformInvocation(mockBehavior.Object);

            mockRequest.VerifyAll();
            mockBehavior.VerifyAll();
            mockSubject.Verify(s => s.OnError(It.Is<Exception>(e => e.Message == "Binder returned by behavior did not yield an instance of InvocationInfo.")));
        }
 internal static void SetInvocationInfo(this IKayakContext context, InvocationInfo info)
 {
     context.Items[InvocationInfoContextKey] = info;
 }
Example #5
0
 public KayakInvocation(KayakContext context, InvocationInfo info)
 {
     Context = context;
     Info = info;
     Binders = new List<IParameterBinder>();
     Handlers = new List<IResultHandler>();
 }
Example #6
0
 internal static void SetInvocationInfo(this IDictionary<string, object> context, InvocationInfo info)
 {
     context[InvocationInfoContextKey] = info;
 }
Example #7
0
 internal MappingEventArgs(KayakContext context, InvocationInfo invocationInfo)
 {
     Context = context;
     InvocationInfo = invocationInfo;
 }
Example #8
0
        InvocationInfo RaiseMapping(KayakContext context, InvocationInfo invocationInfo)
        {
            if (Mapping != null)
            {
                var mappingArgs = new MappingEventArgs(context, invocationInfo);
                Mapping(this, mappingArgs);
                invocationInfo = mappingArgs.InvocationInfo;
            }

            return invocationInfo;
        }
Example #9
0
        public void WillRespond(KayakContext context, Action<bool, Exception> callback)
        {
            try
            {

                InvocationInfo invocationInfo = new InvocationInfo();
                invocationInfo.Method = GetMethodForContext(context);
                invocationInfo = RaiseMapping(context, invocationInfo);

                bool willRespond = invocationInfo.Method != null;

                if (willRespond)
                    context.Items[InvocationInfoContextKey] = invocationInfo;

                callback(willRespond, null);
            }
            catch (Exception e)
            {
                callback(false, e);
            }
        }