ninject - 无法让 Ninject.Extensions.Interception 工作

标签 ninject ninject-interception

我已经尝试了很长时间来弄清楚这是我们的。当我尝试将我的类与拦截器绑定(bind)时,我在线上遇到以下异常

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

加载 Ninject 组件 IAdviceFactory 时出错。在内核的组件容器中没有注册过这样的组件

我尝试过使用和不使用 LoadExtensions,使用模块来设置我的绑定(bind),我的最后一次尝试看起来像这样
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;
    }
}

我的记录器属性看起来像这样
public class LogAttribute : InterceptAttribute
{
    public override IInterceptor CreateInterceptor(IProxyRequest request)
    {
        return request.Context.Kernel.Get<ILoggerAspect>();
    }
}

我的拦截器是这样的
 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);
    }
}

最佳答案

除了Remo Gloor's answer这使我倾向于为 Ninject.Extensions.Interception.DynamicProxy 添加 nuget 包,我一直得到与 OP 相同的异常,直到我手动加载 DynamicProxyModule - FuncModule也是手动加载的,以解决涉及工厂扩展的类似错误:

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

关于ninject - 无法让 Ninject.Extensions.Interception 工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9988204/

相关文章:

dependency-injection - 如何创建一个返回相同对象的 Ninject 自定义范围,直到该对象被释放?

c# - 调试拦截器模式

c# - AOP Ninject 停止拦截方法被调用

asp.net-mvc-3 - 具有 ninject 的插件架构 - 将类和 Controller 实例从插件程序集加载到主 MVC 项目

asp.net-mvc-3 - 使用存储库模型的 MVC3 和 Ninject 每个请求的 RavenDB session

asp.net-mvc - 使用 Ninject 将类注入(inject) IModelBinder

c# - Ninject 拦截代理类与非空构造函数通过 caSTLe 动态代理

c# - 带有 Ninject 拦截、CaSTLe DynamicProxy 和 WPF 窗口的 AOP : Can't find XAML resource in DynamicProxy of window

c# - 如何使用 Ninject 设置可选的方法拦截?

c# - 使用 Ninject OWIN 中间件在 OWIN 启动中依赖注入(inject) UserStore