/// <summary>
        /// Sends <see cref="IDbCommandInterceptor.NonQueryExecuting" /> and
        /// <see cref="IDbCommandInterceptor.NonQueryExecuted" /> to any <see cref="IDbCommandInterceptor" />
        /// registered on <see cref="DbInterception" /> before/after making a
        /// call to <see cref="DbCommand.ExecuteNonQuery" />.
        /// </summary>
        /// <remarks>
        /// Note that the result of executing the command is returned by this method. The result is not available
        /// in the interception context passed into this method since the interception context is cloned before
        /// being passed to interceptors.
        /// </remarks>
        /// <param name="command">The command on which the operation will be executed.</param>
        /// <param name="interceptionContext">Optional information about the context of the call being made.</param>
        /// <returns>The result of the operation, which may have been modified by interceptors.</returns>
        public virtual int NonQuery(DbCommand command, DbCommandInterceptionContext interceptionContext)
        {
            Check.NotNull(command, "command");
            Check.NotNull(interceptionContext, "interceptionContext");

            return(_internalDispatcher.Dispatch(
                       command,
                       (t, c) => t.ExecuteNonQuery(),
                       new DbCommandInterceptionContext <int>(interceptionContext),
                       (i, t, c) => i.NonQueryExecuting(t, c),
                       (i, t, c) => i.NonQueryExecuted(t, c)));
        }
Exemplo n.º 2
0
        /// <summary>
        /// Sends <see cref="IDbCommandInterceptor.NonQueryExecuting" /> and
        /// <see cref="IDbCommandInterceptor.NonQueryExecuted" /> to any <see cref="IDbCommandInterceptor" />
        /// registered on <see cref="DbInterception" /> before/after making a
        /// call to <see cref="DbCommand.ExecuteNonQuery" />.
        /// </summary>
        /// <remarks>
        /// Note that the result of executing the command is returned by this method. The result is not available
        /// in the interception context passed into this method since the interception context is cloned before
        /// being passed to interceptors.
        /// </remarks>
        /// <param name="command">The command on which the operation will be executed.</param>
        /// <param name="interceptionContext">Optional information about the context of the call being made.</param>
        /// <returns>The result of the operation, which may have been modified by interceptors.</returns>
        public virtual int NonQuery(DbCommand command, DbCommandInterceptionContext interceptionContext)
        {
            Check.NotNull(command, "command");
            Check.NotNull(interceptionContext, "interceptionContext");

            var clonedInterceptionContext = new DbCommandInterceptionContext <int>(interceptionContext);

            return(_internalDispatcher.Dispatch <DbCommandInterceptionContext <int>, int>(
                       command.ExecuteNonQuery,
                       clonedInterceptionContext,
                       i => i.NonQueryExecuting(command, clonedInterceptionContext),
                       i => i.NonQueryExecuted(command, clonedInterceptionContext)));
        }
Exemplo n.º 3
0
        public virtual bool Opening(EntityConnection entityConnection, DbInterceptionContext interceptionContext)
        {
            DebugCheck.NotNull(entityConnection);
            DebugCheck.NotNull(interceptionContext);

            return(_internalDispatcher.Dispatch(true, (b, i) => i.ConnectionOpening(entityConnection, interceptionContext) && b));
        }
        public virtual bool Executing(DbCommand command, DbInterceptionContext interceptionContext)
        {
            DebugCheck.NotNull(command);
            DebugCheck.NotNull(interceptionContext);

            return(_internalDispatcher.Dispatch(true, (b, i) => i.CommandExecuting(command, interceptionContext) && b));
        }
Exemplo n.º 5
0
            public void Operation_Dispatch_is_aborted_if_Executed_interceptor_throws_exception()
            {
                var interceptionContext = new DbCommandInterceptionContext <string>();
                var mockInterceptors    = CreateMockInterceptors(
                    c => { },
                    c => { throw new Exception("Ba-da-bing!"); });

                var dispatcher = new InternalDispatcher <IFakeInterceptor1>();

                mockInterceptors.Each(i => dispatcher.Add(i.Object));

                Assert.Equal(
                    "Ba-da-bing!",
                    Assert.Throws <Exception>(
                        () => dispatcher.Dispatch(
                            new object(),
                            (t, c) => "N",
                            interceptionContext,
                            (i, t, c) => i.CallMeFirst(c),
                            (i, t, c) => i.CallMe(c))).Message);

                mockInterceptors.Each(i => i.Verify(m => m.CallMeFirst(interceptionContext), Times.Once()));
                mockInterceptors.First().Verify(m => m.CallMe(interceptionContext), Times.Once());
                mockInterceptors.Skip(1).Each(i => i.Verify(m => m.CallMe(interceptionContext), Times.Never()));
            }
Exemplo n.º 6
0
            public void Interceptors_can_be_added_removed_and_dispatched_to_concurrently()
            {
                var interceptors = new ConcurrentStack <InterceptorForThreads>();
                var dispatcher   = new InternalDispatcher <InterceptorForThreads>();

                const int interceptorCount = 20;
                const int dispatchCount    = 10;

                // Add in parallel
                ExecuteInParallel(
                    () =>
                {
                    var interceptor = new InterceptorForThreads();
                    interceptors.Push(interceptor);
                    dispatcher.Add(interceptor);
                }, interceptorCount);

                Assert.Equal(interceptorCount, interceptors.Count);

                // Dispatch in parallel
                var calledInterceptors = new ConcurrentStack <InterceptorForThreads>();

                ExecuteInParallel(() => dispatcher.Dispatch(calledInterceptors.Push), dispatchCount);

                Assert.Equal(dispatchCount * interceptorCount, calledInterceptors.Count);
                interceptors.Each(i => Assert.Equal(dispatchCount, calledInterceptors.Count(c => c == i)));

                var toRemove = new ConcurrentStack <InterceptorForThreads>(interceptors);

                // Add, remove, and dispatch in parallel
                ExecuteInParallel(
                    () =>
                {
                    dispatcher.Dispatch(i => { });
                    InterceptorForThreads interceptor;
                    toRemove.TryPop(out interceptor);
                    dispatcher.Remove(interceptor);
                    dispatcher.Add(interceptor);
                }, interceptorCount);

                // Dispatch in parallel
                calledInterceptors = new ConcurrentStack <InterceptorForThreads>();
                ExecuteInParallel(() => dispatcher.Dispatch(calledInterceptors.Push), dispatchCount);

                Assert.Equal(dispatchCount * interceptorCount, calledInterceptors.Count);
                interceptors.Each(i => Assert.Equal(dispatchCount, calledInterceptors.Count(c => c == i)));
            }
        public virtual void Loaded(DbConfigurationLoadedEventArgs loadedEventArgs, DbInterceptionContext interceptionContext)
        {
            DebugCheck.NotNull(loadedEventArgs);
            DebugCheck.NotNull(interceptionContext);

            var clonedInterceptionContext = new DbConfigurationInterceptionContext(interceptionContext);

            _internalDispatcher.Dispatch(i => i.Loaded(loadedEventArgs, clonedInterceptionContext));
        }
        public virtual DbCommandTree Created(DbCommandTree commandTree, DbInterceptionContext interceptionContext)
        {
            DebugCheck.NotNull(commandTree);
            DebugCheck.NotNull(interceptionContext);

            var clonedInterceptionContext = new DbCommandTreeInterceptionContext(interceptionContext);

            return(_internalDispatcher.Dispatch(
                       commandTree, clonedInterceptionContext, i => i.TreeCreated(clonedInterceptionContext)));
        }
Exemplo n.º 9
0
        public virtual DbCommandTree Created(DbCommandTree commandTree, DbInterceptionContext interceptionContext)
        {
            DebugCheck.NotNull(commandTree);
            DebugCheck.NotNull(interceptionContext);

            return(_internalDispatcher.Dispatch(
                       commandTree,
                       new DbCommandTreeInterceptionContext(interceptionContext),
                       (i, c) => i.TreeCreated(c)));
        }
Exemplo n.º 10
0
            public void Result_Dispatch_dispatches_to_all_registered_interceptors_and_aggregates_result()
            {
                var mockInterceptors = CreateMockInterceptors(c => { }, c => { });

                var dispatcher = new InternalDispatcher <IFakeInterceptor1>();

                mockInterceptors.Each(i => dispatcher.Add(i.Object));

                Assert.Equal("0123", dispatcher.Dispatch("0", (r, i) => r + i.CallMe(new DbCommandInterceptionContext <string>())));

                mockInterceptors.Each(i => i.Verify(m => m.CallMe(It.IsAny <DbCommandInterceptionContext <string> >()), Times.Once()));
            }
Exemplo n.º 11
0
            public void Simple_Dispatch_dispatches_to_all_registered_interceptors()
            {
                var mockInterceptors = CreateMockInterceptors(c => { }, c => { });

                var dispatcher = new InternalDispatcher <IFakeInterceptor1>();

                mockInterceptors.Each(i => dispatcher.Add(i.Object));

                dispatcher.Dispatch(i => i.CallMe(new DbCommandInterceptionContext <string>()));

                mockInterceptors.Each(i => i.Verify(m => m.CallMe(It.IsAny <DbCommandInterceptionContext <string> >()), Times.Once()));
            }
Exemplo n.º 12
0
            public void Interceptors_for_only_the_matching_interface_type_can_be_added_and_removed()
            {
                var mockInterceptor1 = new Mock <IFakeInterceptor1>();
                var mockInterceptor2 = new Mock <IFakeInterceptor2>();

                var dispatcher = new InternalDispatcher <IFakeInterceptor1>();

                dispatcher.Add(mockInterceptor1.Object);
                dispatcher.Add(mockInterceptor2.Object);

                dispatcher.Dispatch(i => i.CallMe(new DbCommandInterceptionContext <string>()));

                mockInterceptor1.Verify(m => m.CallMe(It.IsAny <DbCommandInterceptionContext <string> >()), Times.Once());
                mockInterceptor2.Verify(m => m.CallMe(It.IsAny <DbCommandInterceptionContext <string> >()), Times.Never());

                dispatcher.Remove(mockInterceptor1.Object);
                dispatcher.Remove(mockInterceptor2.Object);

                dispatcher.Dispatch(i => i.CallMe(new DbCommandInterceptionContext <string>()));

                mockInterceptor1.Verify(m => m.CallMe(It.IsAny <DbCommandInterceptionContext <string> >()), Times.Once());
                mockInterceptor2.Verify(m => m.CallMe(It.IsAny <DbCommandInterceptionContext <string> >()), Times.Never());
            }
Exemplo n.º 13
0
            public void Execution_of_operation_can_be_suppressed_by_setting_exception_with_everything_else_still_happening()
            {
                var interceptionContext = new DbCommandInterceptionContext <string>();
                var mockInterceptors    = CreateMockInterceptors(
                    c =>
                {
                    Assert.False(c.IsAsync);
                    Assert.Null(c.Result);
                    Assert.Null(c.OriginalResult);
                    Assert.Null(c.OriginalException);
                    if (c.Exception == null)
                    {
                        c.Exception = new Exception("Bing!");
                    }
                    Assert.True(c.IsExecutionSuppressed);
                },
                    c =>
                {
                    Assert.False(c.IsAsync);
                    Assert.Null(c.Result);
                    Assert.Null(c.OriginalResult);
                    Assert.Equal("Bing!", c.Exception.Message);
                    Assert.Null(c.OriginalException);
                    Assert.True(c.IsExecutionSuppressed);
                });

                var dispatcher = new InternalDispatcher <IFakeInterceptor1>();

                mockInterceptors.Each(i => dispatcher.Add(i.Object));

                var exception = Assert.Throws <Exception>(
                    () => dispatcher.Dispatch <Object, DbCommandInterceptionContext <string>, string>(
                        new object(),
                        (t, c) => { throw new Exception("Bang!"); },
                        interceptionContext,
                        (i, t, c) => i.CallMeFirst(c),
                        (i, t, c) => i.CallMe(c)));

                Assert.Equal("Bing!", exception.Message);

                mockInterceptors.Each(i => i.Verify(m => m.CallMeFirst(interceptionContext), Times.Once()));
                mockInterceptors.Each(i => i.Verify(m => m.CallMe(interceptionContext), Times.Once()));
            }
Exemplo n.º 14
0
            public void Execution_of_operation_can_be_suppressed_by_setting_result_with_everything_else_still_happening()
            {
                var interceptionContext = new DbCommandInterceptionContext <string>();
                var mockInterceptors    = CreateMockInterceptors(
                    c =>
                {
                    Assert.False(c.IsAsync);
                    Assert.Null(c.OriginalResult);
                    Assert.Null(c.Exception);
                    Assert.Null(c.OriginalException);
                    if (c.Result == null)
                    {
                        c.Result = "N";
                    }
                    Assert.True(c.IsExecutionSuppressed);
                },
                    c =>
                {
                    Assert.False(c.IsAsync);
                    Assert.NotEmpty(c.Result);
                    Assert.Null(c.OriginalResult);
                    Assert.Null(c.Exception);
                    Assert.Null(c.OriginalException);
                    Assert.True(c.IsExecutionSuppressed);
                });

                var dispatcher = new InternalDispatcher <IFakeInterceptor1>();

                mockInterceptors.Each(i => dispatcher.Add(i.Object));

                Assert.Equal(
                    "N123",
                    dispatcher.Dispatch(
                        (Func <string>)(() => { throw new Exception("Bang!"); }),
                        interceptionContext,
                        i => i.CallMeFirst(interceptionContext),
                        i => interceptionContext.Result = interceptionContext.Result + i.CallMe(interceptionContext)));

                mockInterceptors.Each(i => i.Verify(m => m.CallMeFirst(interceptionContext), Times.Once()));
                mockInterceptors.Each(i => i.Verify(m => m.CallMe(interceptionContext), Times.Once()));
            }
Exemplo n.º 15
0
            public void Operation_Dispatch_can_change_exception_thrown()
            {
                var interceptionContext = new DbCommandInterceptionContext <string>();
                var mockInterceptors    = CreateMockInterceptors(
                    c =>
                {
                    Assert.False(c.IsAsync);
                    Assert.Null(c.Result);
                    Assert.Null(c.OriginalResult);
                    Assert.Null(c.Exception);
                    Assert.Null(c.OriginalException);
                    Assert.False(c.IsExecutionSuppressed);
                },
                    c =>
                {
                    Assert.False(c.IsAsync);
                    Assert.Null(c.Result);
                    Assert.Null(c.OriginalResult);
                    Assert.NotEmpty(c.Exception.Message);
                    Assert.Equal("Bang!", c.OriginalException.Message);
                    c.Exception = new Exception("Bing!");
                    Assert.False(c.IsExecutionSuppressed);
                });

                var dispatcher = new InternalDispatcher <IFakeInterceptor1>();

                mockInterceptors.Each(i => dispatcher.Add(i.Object));

                var exception = Assert.Throws <Exception>(
                    () => dispatcher.Dispatch <Object, DbCommandInterceptionContext <string>, string>(
                        new object(),
                        (t, c) => { throw new Exception("Bang!"); },
                        interceptionContext,
                        (i, t, c) => i.CallMeFirst(c),
                        (i, t, c) => i.CallMe(c)));

                Assert.Equal("Bing!", exception.Message);

                mockInterceptors.Each(i => i.Verify(m => m.CallMeFirst(interceptionContext), Times.Once()));
                mockInterceptors.Each(i => i.Verify(m => m.CallMe(interceptionContext), Times.Once()));
            }
Exemplo n.º 16
0
            public void Operation_Dispatch_dispatches_to_all_registered_interceptors_and_aggregates_results_of_operations()
            {
                var interceptionContext = new DbCommandInterceptionContext <string>();
                var mockInterceptors    = CreateMockInterceptors(
                    c =>
                {
                    Assert.False(c.IsAsync);
                    Assert.Null(c.Result);
                    Assert.Null(c.OriginalResult);
                    Assert.Null(c.Exception);
                    Assert.Null(c.OriginalException);
                    Assert.False(c.IsExecutionSuppressed);
                },
                    c =>
                {
                    Assert.False(c.IsAsync);
                    Assert.NotEmpty(c.Result);
                    Assert.Equal("0", c.OriginalResult);
                    Assert.Null(c.Exception);
                    Assert.Null(c.OriginalException);
                    Assert.False(c.IsExecutionSuppressed);
                });

                var dispatcher = new InternalDispatcher <IFakeInterceptor1>();

                mockInterceptors.Each(i => dispatcher.Add(i.Object));

                Assert.Equal(
                    "0123",
                    dispatcher.Dispatch(
                        new object(),
                        (t, c) => "0",
                        interceptionContext,
                        (i, t, c) => i.CallMeFirst(interceptionContext),
                        (i, t, c) => interceptionContext.Result = interceptionContext.Result + i.CallMe(interceptionContext)));

                mockInterceptors.Each(i => i.Verify(m => m.CallMeFirst(interceptionContext), Times.Once()));
                mockInterceptors.Each(i => i.Verify(m => m.CallMe(interceptionContext), Times.Once()));
            }
Exemplo n.º 17
0
            public void Operation_Dispatch_dispatches_to_all_registered_interceptors_even_if_exception_thrown()
            {
                var interceptionContext = new DbCommandInterceptionContext <string>();
                var mockInterceptors    = CreateMockInterceptors(
                    c =>
                {
                    Assert.False(c.IsAsync);
                    Assert.Null(c.Result);
                    Assert.Null(c.OriginalResult);
                    Assert.Null(c.Exception);
                    Assert.Null(c.OriginalException);
                    Assert.False(c.IsExecutionSuppressed);
                },
                    c =>
                {
                    Assert.False(c.IsAsync);
                    Assert.Null(c.Result);
                    Assert.Null(c.OriginalResult);
                    Assert.Equal("Bang!", c.Exception.Message);
                    Assert.Equal("Bang!", c.OriginalException.Message);
                    Assert.False(c.IsExecutionSuppressed);
                });

                var dispatcher = new InternalDispatcher <IFakeInterceptor1>();

                mockInterceptors.Each(i => dispatcher.Add(i.Object));

                var exception = Assert.Throws <Exception>(
                    () => dispatcher.Dispatch(
                        (Func <string>)(() => { throw new Exception("Bang!"); }),
                        interceptionContext,
                        i => i.CallMeFirst(interceptionContext),
                        i => i.CallMe(interceptionContext)));

                Assert.Equal("Bang!", exception.Message);

                mockInterceptors.Each(i => i.Verify(m => m.CallMeFirst(interceptionContext), Times.Once()));
                mockInterceptors.Each(i => i.Verify(m => m.CallMe(interceptionContext), Times.Once()));
            }
Exemplo n.º 18
0
            public void Operation_Dispatch_can_prevent_exception_from_being_thrown_and_return_result_instead()
            {
                var interceptionContext = new DbCommandInterceptionContext <string>();
                var mockInterceptors    = CreateMockInterceptors(
                    c =>
                {
                    Assert.False(c.IsAsync);
                    Assert.Null(c.Result);
                    Assert.Null(c.OriginalResult);
                    Assert.Null(c.Exception);
                    Assert.Null(c.OriginalException);
                    Assert.False(c.IsExecutionSuppressed);
                },
                    c =>
                {
                    Assert.False(c.IsAsync);
                    Assert.Null(c.OriginalResult);
                    Assert.Equal("Bang!", c.OriginalException.Message);
                    c.Exception = null;
                    c.Result    = "N";
                    Assert.False(c.IsExecutionSuppressed);
                });

                var dispatcher = new InternalDispatcher <IFakeInterceptor1>();

                mockInterceptors.Each(i => dispatcher.Add(i.Object));

                Assert.Equal(
                    "N",
                    dispatcher.Dispatch <Object, DbCommandInterceptionContext <string>, string>(
                        new object(),
                        (t, c) => { throw new Exception("Bang!"); },
                        interceptionContext,
                        (i, t, c) => i.CallMeFirst(c),
                        (i, t, c) => i.CallMe(c)));

                mockInterceptors.Each(i => i.Verify(m => m.CallMeFirst(interceptionContext), Times.Once()));
                mockInterceptors.Each(i => i.Verify(m => m.CallMe(interceptionContext), Times.Once()));
            }