2

我正在使用 caliburn.micro 框架开发 WPF 桌面应用程序,并且我想配置 ninject 拦截器以便可以拦截方法调用。我想这样做是为了在一个集中的地方处理异常,这样我的代码周围就没有很多 try-catch 块。

我无法完成这个,因为每次我用 ninject 连接所有东西时,系统都会抛出异常。

所以这里有一些代码:

AppBootstrapper 配置方法如下所示:

    protected override void Configure()
    {
        _kernel = new StandardKernel(new NinjectServiceModule());
        _kernel.Bind<IWindowManager>().To<WindowManager>().InSingletonScope();
        _kernel.Bind<IEventAggregator>().To<EventAggregator>().InSingletonScope();
        _kernel.Bind<ISomeViewModel>().To<SomeViewModel>().Intercept().With<SomeInterceptor>() //this is where the exception is thrown;
        _kernel.Bind<IShell>().To<ShellViewModel>();
    }

现在我的拦截器中的拦截方法:

    public void Intercept(IInvocation invocation)
    {
        if (invocation.Request.Method.Name == "TheMethodIWantIntercepted")
        {
            try
            {
                invocation.Proceed();
            }
            catch (Exception)
            {

                Console.WriteLine("I Handled exception");
            }
        }
        else
        {
            invocation.Proceed();
        }

    }

视图模型中的方法如下所示:

    public virtual void TheMethodIWantIntercepted()
    {
        //Some logic here
    }

这就是拦截器应该如何工作的方式。但它不起作用,每次我运行程序,ninject 尝试将 SomeViewModel 的实例注入 ISomeViewModel,程序执行失败,这是抛出的异常(和堆栈跟踪): http://pastebin .com/qerZAjVr

希望您能帮我解决这个问题,在此先感谢您。

4

1 回答 1

1

You have to load either DynamicProxy(2)Module or LinFuModule depending on what proxy library you prefer.

Also be aware that Ninject 2.2 will create a class proxy for SomeViewModel which requires:

  1. a parameterless constructor
  2. virtual methods

Interface proxies don't have this restriction but this requires Ninject 3.0.0

于 2012-02-21T22:18:04.273 回答