Ninject拦截WCF服务

时间:2014-09-04 10:05:38

标签: wcf attributes ninject interception

我是这个主题的新手,所以我会努力让这个尽可能清楚......

我创建了一个WcfModule,我加载了以下包:

Bind<IDistributorService>().To<DistributorService>().InRequestScope().Intercept().With<ExceptionInterceptor>();

首先,我没有收到任何错误,但我在我的函数上放了一个InterceptAttribute:

[AttributeUsage(AttributeTargets.Method)]
public sealed class HandleExceptionsAttribute : InterceptAttribute
{
    public override IInterceptor CreateInterceptor(IProxyRequest request)
    {
        return request.Kernel.Get<ExceptionInterceptor>();
    }
}

[HandleExceptions]
public virtual Result<List<DistributorDataContract>> GetDistributor(string id)
{
   //...code...

我在这个函数中遇到错误:(方法中的第一行)

private ServiceHost CreateNewServiceHost(Type serviceType, Uri[] baseAddresses, WebHttpBehavior webBehavior, WebHttpBinding webHttpBinding)
{
  var host = base.CreateServiceHost(serviceType, baseAddresses);
  //...
}

错误:

  

用户代码未处理InvalidProxyConstructorArgumentsException   无法实例化类的代理:   My.Namespace.DistributorService。   找不到无参数构造函数。

任何知道问题可能是什么的人?谢谢!

1 个答案:

答案 0 :(得分:0)

当指示创建一个没有无参数(默认)构造函数且没有构造函数参数传递给castle的“类代理”时,castle core dynamic代理抛出此异常(请参阅source

我最好的猜测是,当你按属性使用ninject拦截时,无论你的绑定是Bind<IFoo>().To<Foo>()还是Bind<Foo>().ToSelf(),ninject都会指示城堡核心创建一个类代理。

然而,看起来有点奇怪的是,ninject没有解析并传递所有必需的构造函数参数。

DistributorService的实现是什么?包含CreateNewServiceHost的类的基类的实现是什么?

解决方法: 当然,切换到Intercept().With<TInterceptor>()语法也可能使您能够使用拦截(参见http://codepyre.com/2010/03/using-ninject-extensions-interception-part-2-working-with-interceptors/