ninject ninject-interception

No se puede hacer funcionar Ninject.Extensions.Interception



ninject-interception (2)

Llevo años intentando imaginarlo. cuando intento enlazar mi clase con un interceptor, obtengo la siguiente excepción en la línea

Kernel.Bind<MyClass>().ToSelf().Intercept().With<ILoggerAspect>();

Error al cargar el componente Ninject IAdviceFactory. No se ha registrado dicho componente en el contenedor de componentes del kernel.

He intentado con y sin LoadExtensions, con el uso de un módulo para configurar mis enlaces y mi último intento se ve así

internal class AppConfiguration { internal AppConfiguration( ) { var settings = new NinjectSettings() { LoadExtensions = false }; Kernel = new StandardKernel(settings); Load(); } internal StandardKernel Kernel { get; set; } public static AppConfiguration Instance { get { return _instance ?? (_instance = new AppConfiguration()); } } private static AppConfiguration _instance; private void Load() { Kernel.Bind<ILoggerAspect>().To<Log4NetAspect>().InSingletonScope(); Kernel.Bind<MyClass>().ToSelf().Intercept().With<ILoggerAspect>(); } internal static StandardKernel Resolver() { return Instance.Kernel; } }

Mi atributo de registrador se ve así

public class LogAttribute : InterceptAttribute { public override IInterceptor CreateInterceptor(IProxyRequest request) { return request.Context.Kernel.Get<ILoggerAspect>(); } }

Y mi interceptor como este

public class Log4NetAspect : SimpleInterceptor, ILoggerAspect { protected override void BeforeInvoke(IInvocation invocation) { Debug.WriteLine("Running " + invocation.ReturnValue); base.BeforeInvoke(invocation); } public new void Intercept(IInvocation invocation) { try { base.Intercept(invocation); } catch (Exception e) { Debug.WriteLine("Exception: " + e.Message); } } protected override void AfterInvoke(IInvocation invocation) { Debug.WriteLine("After Method"); base.AfterInvoke(invocation); } }


Además de la respuesta de Remo Gloor, que me apuntó hacia la adición del paquete nuget para Ninject.Extensions.Interception.DynamicProxy , seguí recibiendo la misma excepción que el OP, hasta que DynamicProxyModule manualmente un DynamicProxyModule : el FuncModule se carga manualmente para que funcione. alrededor de un error similar que involucra la extensión de fábrica:

_kernel = new StandardKernel( new NinjectSettings{LoadExtensions = true}, new FuncModule(), new DynamicProxyModule()); // <~ this is what fixed it


Lo más probable es que no haya implementado Ninject.Extensions.Interception.DynamicProxy o Ninject.Extensions.Interception.Linfu junto con su aplicación [y Ninject.Extensions.Interception ]. Tienes que elegir exactamente uno de ellos.

Con el código tal como lo tiene ahora ( LoadExtensions=false ), no podrá recoger la biblioteca de interceptación específica. Debe eliminar eso y la carga normal de las extensiones debe conectar la extensión al Kernel en la creación para que los bits de intercepción la seleccionen. arriba.