无法使用Ninject拦截来使用WCF

时间:2013-08-12 12:40:45

标签: wcf ninject ninject-extensions ninject-interception

我们将从UNITY切换到Ninject作为WCF服务的默认服务定位器。有一个漂亮的NuGet包可以做到这一点,让标准分辨率正常运行是轻而易举的。

然而 - 我想拦截对我的WCF服务的调用。这就是我所拥有的:

我的svc文件:

<%@ ServiceHost Language="C#" Debug="true" Service="NinjectWcfApp.Service1" Factory="Ninject.Extensions.Wcf.NinjectServiceHostFactory" %>

这是我的服务:

public class Service1 : IService1
{


   [Inject]
    public ISomeManager Manager { get; set; }


public string GetData(int value)
{
    if(this.Manager != null)
        this.Manager.DoStuff();


    return string.Format("You entered: {0}", value);
}

}

内核构建如下:

private static void RegisterServices(IKernel kernel)
{
    kernel.Bind<ISomeManager>().To<SomeManager>();
    kernel.Bind<IService1>().To<Service1>().Intercept().With<MyInterceptor>();
}   

如果我像这样设置内核,则会注入管理器实例,但不会发生拦截。我永远不会调用在执行之前和执行之后记录某些内容的拦截器。

其他Stackoverflow线程建议使用:

    kernel.Bind<Service1>().ToSelf().Intercept().With<MyInterceptor>();

如果我这样做,经理就不会被注入。如果我然后继续创建一个接受管理器的构造函数,它可以工作,但是再次:没有拦截。

    kernel.Bind<Service1>().ToSelf().WithConstructorArgument("manager", kernel.Get<ISomeManager>()).Intercept().With<MyInterceptor>();

我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

任何截获的方法都必须是虚拟的:

    public virtual string GetData(int value)