suponiendo que está utilizando Ninject.Extensions.Interception esto debe hacer el truco
public class TransactionInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
// Do something...
}
}
public class TransactionAttribute : InterceptAttribute
{
public override IInterceptor CreateInterceptor(IProxyRequest request)
{
return new TransactionInterceptor();
}
}
public class SomeClass
{
[Transaction]
public virtual void SomeTransactedMethod() { }
}
Asegúrese de que el método que debe ser interceptada es marca ed como virtual.
Cuando se llama SomeTransactedMethod()
, debe ser interceptado.
var kernel = new StandardKernel();
kernel.Bind<SomeClass>().ToSelf();
var someClass = kernel.Get<SomeClass>();
someClass.SomeTransactedMethod();
ACTUALIZACIÓN
Se puede crear una estrategia de planificación personalizada.
public class CustomPlanningStrategy<TAttribute, TInterceptor> :
NinjectComponent, IPlanningStrategy
where TAttribute : Attribute
where TInterceptor : IInterceptor
{
private readonly IAdviceFactory adviceFactory;
private readonly IAdviceRegistry adviceRegistry;
public CustomPlanningStrategy(
IAdviceFactory adviceFactory, IAdviceRegistry adviceRegistry)
{
this.adviceFactory = adviceFactory;
this.adviceRegistry = adviceRegistry;
}
public void Execute(IPlan plan)
{
var methods = GetCandidateMethods(plan.Type);
foreach (var method in methods)
{
var attributes = method.GetCustomAttributes(
typeof(TAttribute), true) as TAttribute[];
if (attributes.Length == 0)
{
continue;
}
var advice = adviceFactory.Create(method);
advice.Callback = request => request.Kernel.Get<TInterceptor>();
adviceRegistry.Register(advice);
if (!plan.Has<ProxyDirective>())
{
plan.Add(new ProxyDirective());
}
}
}
}
private static IEnumerable<MethodInfo> GetCandidateMethods(Type type)
{
var methods = type.GetMethods(
BindingFlags.Public |
BindingFlags.NonPublic |
BindingFlags.Instance
);
return methods.Where(ShouldIntercept);
}
private static bool ShouldIntercept(MethodInfo methodInfo)
{
return methodInfo.DeclaringType != typeof(object) &&
!methodInfo.IsPrivate &&
!methodInfo.IsFinal;
}
}
Esto debería funcionar ahora.
var kernel = new StandardKernel();
kernel.Components.Add<IPlanningStrategy,
CustomPlanningStrategy<TransactionAttribute, TransactionInterceptor>>();
kernel.Bind<SomeClass>().ToSelf();
var someClass = kernel.Get<SomeClass>();
someClass.SomeTransactedMethod();
puedo tener mis atributos que heredan de InterceptAttribute , como el dominio donde la transacción ion attribute se define sin conocimiento de las preocupaciones DI ... Por eso tengo que hacerlo a través del método Kernel.Intercept, que se define dentro de la capa de la aplicación. – somemvcperson
Ok, ahora veo ... He realizado una implementación cruda de IPlanningStrategy que con suerte servirá para solucionar el problema. Es posible que desee consultar el código real de [Ninject.Extensions.Inteception] (https://github.com/ninject/ninject.extensions.interception) en Github para conocer formas de mejorar la estrategia de planificación personalizada. – mrydengren
Hmm parece un poco más trabajo que lo que buscaba ... Estaba seguro de que hace un tiempo vi un ejemplo de un solo trazador de líneas simple usando el método de extensión Intercept en Kernel, le daré otra búsqueda en internet y si todo más falla, prueba lo de arriba ... gracias. – somemvcperson