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.