/// <inheritdoc /> public override void OnException(IInvocationPipeline pipeline) { Console.WriteLine("ReplaceExceptionAspect OnException called"); pipeline.ContinueFaulted( new ApplicationException("Additional exception info", pipeline.CurrentException)); }
protected override void Exit(IInvocationPipeline pipeline) { base.Exit(pipeline); if (_boundaryType == BoundaryType.Exit) { ThrowException(CreateException(_exceptionType), pipeline); } }
public override void OnSuccess(IInvocationPipeline pipeline) { base.OnSuccess(pipeline); if (_boundaryType == BoundaryType.Success) { ThrowException(CreateException(_exceptionType), pipeline); } }
public override void OnSuccess(IInvocationPipeline pipeline) { base.OnSuccess(pipeline); if (_boundaryType == BoundaryType.Success) { pipeline.Return(); } }
protected override void Exit(IInvocationPipeline pipeline) { base.Exit(pipeline); if (_boundaryType == BoundaryType.Exit) { pipeline.Return(); } }
protected override void Exception(IInvocationPipeline pipeline) { base.Exception(pipeline); if (_boundaryType == BoundaryType.Exception) { pipeline.Return(_valueToReturn); } }
protected void ThrowException(Exception exception, IInvocationPipeline pipeline) { if (_throwAsUnhandled) { throw exception; } pipeline.Throw(exception); }
public void ExecutePipeline(IInvocationPipeline basePipeline, IInvocation invocation) { // Это нарушает solid, но позволяет не выставлять кучу классов наружу библиотеки. var pipeline = (InvocationPipeline)basePipeline; pipeline.Init(invocation); var entryState = new EntryState <InvocationPipeline>( pipeline.BoundaryAspects, pipeline.InterceptionAspect); InvocationStateMachine.Execute(pipeline, entryState); }
/// <inheritdoc /> public override void OnSuccess(IInvocationPipeline pipeline) { // Если по Id-нику смогли что-то найти if (pipeline.CurrentReturnValue != null) { var cacheKey = (string)pipeline.ExecutionState; Cache.Set(cacheKey, pipeline.CurrentReturnValue); Console.WriteLine($"Aspect OnExit: Set '{pipeline.Context.Method.ReturnType.Name}' to cache with key '{cacheKey}'"); } else { Console.WriteLine("Aspect OnExit: SUnable to save value to cache"); } }
/// <summary> /// Создает экземпляр <see cref="InvocationWeaveData"/> с признаком /// возможности применения аспектов. /// </summary> /// <param name="pipeline">Пайплайн.</param> /// <param name="pipelineExecutor">Компонент выполнения пайплайна.</param> /// <param name="boundaryAspects">Аспекты <see cref="MethodBoundaryAspect"/>.</param> /// <param name="interceptionAspect">Аспект <see cref="MethodInterceptionAspect"/>.</param> /// <returns>Экземляр <see cref="InvocationWeaveData"/>.</returns> internal static InvocationWeaveData Weavable( IInvocationPipeline pipeline, IInvocationPipelineExecutor pipelineExecutor, IReadOnlyCollection <MethodBoundaryAspect> boundaryAspects, MethodInterceptionAspect interceptionAspect) { return(new InvocationWeaveData { IsWeaveable = true, Pipeline = pipeline, PipelineExecutor = pipelineExecutor, BoundaryAspects = boundaryAspects, InterceptionAspect = interceptionAspect }); }
/// <inheritdoc /> public override void OnException(IInvocationPipeline pipeline) { Console.WriteLine("SwallowExceptionAspect OnException called"); Console.WriteLine($"Exception '{pipeline.CurrentException.GetType().Name}'; " + $"Exception Message: '{pipeline.CurrentException.Message}'"); var innerException = pipeline.CurrentException.InnerException; if (innerException != null) { Console.WriteLine($"InnerException '{innerException.GetType().Name}'; " + $"InnerException Message: '{innerException.Message}'"); } pipeline.Continue(); }
/// <inheritdoc /> public override void OnEntry(IInvocationPipeline pipeline) { var cacheKey = CreateCacheKey(pipeline); // Если смогли достать значение - прерываем пайплайн вызовом ReturnValue if (Cache.TryGetValue(cacheKey, out var cached)) { Console.WriteLine($"Aspect OnEntry: Return '{pipeline.Context.Method.ReturnType.Name}' with key '{cacheKey}' from cache"); pipeline.Return(cached); } // Значение нет в кеше else { Console.WriteLine($"Aspect OnEntry: Key '{cacheKey}' not found in cache. Calling method..."); // Записываем в состояние ключ кеша для сохранения значения pipeline.ExecutionState = cacheKey; } }
public void ExecutePipeline(IInvocationPipeline basePipeline, IInvocation invocation) { // Это нарушает solid, но позволяет не выставлять кучу классов наружу библиотеки. var pipeline = (AsyncInvocationPipeline)basePipeline; pipeline.Init(invocation); switch (pipeline.Invocation.InvocationType) { case InvocationType.AsyncAction: pipeline.Invocation.ReturnValue = SignalWhenAwait(pipeline); break; case InvocationType.AsyncFunction: var signalWhenAwait = GetAsyncFunctionHandler(_handlersCache, pipeline.Invocation); pipeline.Invocation.ReturnValue = signalWhenAwait(this, new object[] { pipeline }); break; default: throw new NotSupportedException( $"Асинхронное выполнение метода типа '{pipeline.Invocation.InvocationType}' не поддерживается"); } }
protected override void Exception(IInvocationPipeline pipeline) { pipeline.ContinueFaulted(CreateException(_exceptionType, pipeline.CurrentException)); }
/// <inheritdoc /> public override void OnEntry(IInvocationPipeline pipeline) { var str = JsonConvert.SerializeObject(pipeline.Context.Arguments.ElementAt(0), Formatting.Indented); Console.WriteLine($"LogMethodAspect: Method called with first arg : {str}"); }
public override void OnException(IInvocationPipeline pipeline) { pipeline.ContinueFaulted(new InvalidOperationException(string.Empty, pipeline.CurrentException)); }
public override void OnSuccess(IInvocationPipeline pipeline) { throw new ArgumentNullException(); }
public override void OnSuccess(IInvocationPipeline pipeline) { var value = (int)pipeline.CurrentReturnValue; pipeline.Return(value + 1); }
public override void OnEntry(IInvocationPipeline pipeline) { pipeline.Return(new object()); }
protected virtual void Exit(IInvocationPipeline pipeline) { }
public override void OnException(IInvocationPipeline pipeline) { pipeline.Return(); }
protected virtual void Success(IInvocationPipeline pipeline) { }
public override void OnExit(IInvocationPipeline pipeline) { ExecutionStack.Push(new BoundaryState(BoundaryType.Exit)); Exit(pipeline); }
public override void OnSuccess(IInvocationPipeline pipeline) { ExecutionStack.Push(new BoundaryState(BoundaryType.Success)); Success(pipeline); }
protected abstract void Install(IInvocationPipeline pipeline, TProperties properties);
public override void OnSuccess(IInvocationPipeline pipeline) { base.OnSuccess(pipeline); Console.WriteLine("Aspect: OnSuccess"); }
void IInterceptor.Install(IInvocationPipeline pipeline, object properties) => Install(pipeline, (TProperties)properties);
public void Install(IInvocationPipeline pipeline, object properties) { pipeline.Register("test_actor_interception", new TestActorInterceptionInvoker()); pipeline.Register("test_stream_interception", new TestStreamInterceptionInvoker()); }
public override void OnEntry(IInvocationPipeline pipeline) { base.OnEntry(pipeline); Console.WriteLine("Aspect: OnEntry"); }
protected virtual void Entry(IInvocationPipeline pipeline) { }