无法让 Ninject 拦截与 WCF 一起使用

Posted

技术标签:

【中文标题】无法让 Ninject 拦截与 WCF 一起使用【英文标题】:Can't get Ninject Interception to work with WCF 【发布时间】:2013-08-13 18:44:55 【问题描述】:

我们正在从 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>();
   

如果我这样设置内核,管理器实例会被注入,但不会发生拦截。我的拦截器在执行之前和之后记录一些东西,从来没有被调用过。

其他 *** 线程建议使用:

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

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

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

我在这里做错了什么?

【问题讨论】:

【参考方案1】:

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

    public virtual string GetData(int value)

【讨论】:

以上是关于无法让 Ninject 拦截与 WCF 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

让 InRequestScope 与 Ninject 和 WebApi 一起工作

IIS 7.5 自动启动无法使用 Web Activator 与 Ninject 一起使用

在 MVC3 应用程序中将 Ninject 与自定义角色提供程序一起使用

使用 Ninject 2 将参数传递给 WCF ServiceHost 类型

Ninject 3、WCF服务和参数化构造函数

Ninject Interception Extension (AOP) - 好的工作示例/教程? [关闭]