我一直在尝试让 ninject 在 wcf 中工作,使用 wcf 扩展和使用 dynamicproxy2 扩展的拦截。我基本上已经创建了一个 Time 属性,并让它在一个基本场景中工作。我遇到麻烦的地方是在 ninject 模块中我使用构造函数参数创建服务绑定:
Bind<IMyDependency>().To<MyDependency>();
Bind<IService1>().To<Service1>().WithConstructorArgument("dependency", Kernel.Get<IMyDependency>());
一切正常,但 Time 属性不会触发我的 Service1 或 MyDependency 中的任何内容。
时间属性是遍布互联网的标准属性。唯一真正的另一段代码是 CreateKernel 方法是 global.asax,它看起来像这样:
protected override IKernel CreateKernel() {
IKernel kernel = new StandardKernel(
new NinjectSettings() { LoadExtensions = false },
new WcfNinjectModule(),
new DynamicProxy2Module()
);
return kernel;
}
谢谢你的帮助!
马特
编辑 12/12/2011:根据要求,我在下面添加了更多详细信息:整个 wcf ninject 模块:
public class WcfNinjectModule : NinjectModule
{
public override void Load()
{
Bind<IMyDependency>().To<MyDependency>();
Bind<IService1>().To<Service1>();
}
}
global.asax中的create kernel方法如上,global.asax继承自NinjectWcfApplication。
服务方法如下所示:
public class Service1 : IService1
{
private IMyDependency _dependency;
public Service1()
{
}
public Service1(IMyDependency dependency)
{
_dependency = dependency;
}
[Time]
public virtual string GetData(string value)
{
return string.Format(_dependency.GetMyString(), value);
}
}
public interface IMyDependency
{
string GetMyString();
}
public class MyDependency : IMyDependency
{
[Time]
public virtual string GetMyString()
{
return "Hello {0}";
}
}
这有帮助吗?
由于删除了“WithConstructor”参数,时间拦截属性将在 GetMyString 上触发,但不会在 GetData 上触发。
马特