我们将从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>();
我在这里做错了什么?
任何被拦截的方法都必须是虚拟的:
public virtual string GetData(int value)