using System;
using System.Collections.Generic;
using System.Reflection;
using System.Threading.Tasks;
namespace AspectCore.DynamicProxy
{
[NonAspect]
public abstract class AspectContext
{
public abstract IDictionary<string, object> AdditionalData { get; }
public abstract object ReturnValue { get; set; }
public abstract IServiceProvider ServiceProvider { get; }
public abstract MethodInfo ServiceMethod { get; }
public abstract object Implementation { get; }
public abstract MethodInfo ImplementationMethod { get; }
public abstract object[] Parameters { get; }
public abstract MethodInfo ProxyMethod { get; }
public abstract object Proxy { get; }
public abstract Task Break();
public abstract Task Invoke(AspectDelegate next);
public abstract Task Complete();
}
}
using System;
namespace AspectCore.DynamicProxy
{
[NonAspect]
public sealed class AspectContextFactory : IAspectContextFactory
{
private static readonly object[] emptyParameters = new object[0];
private readonly IServiceProvider _serviceProvider;
public AspectContextFactory(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider));
}
public AspectContext CreateContext(AspectActivatorContext activatorContext)
{
return new RuntimeAspectContext(_serviceProvider,
activatorContext.ServiceMethod,
activatorContext.TargetMethod,
activatorContext.ProxyMethod,
activatorContext.TargetInstance,
activatorContext.ProxyInstance,
activatorContext.Parameters ?? emptyParameters);
}
public void ReleaseContext(AspectContext aspectContext)
{
(aspectContext as IDisposable)?.Dispose();
}
}
}