带有WCF和拦截的Ninject(用于AOP)

时间:2011-12-09 17:36:11

标签: wcf attributes ninject aop ninject-extensions

我一直在努力让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上触发。

马特

1 个答案:

答案 0 :(得分:0)

经过多一点工作(并编写最后一篇文章编辑),结果发现只是删除WithConstructorArgument方法确实解决了我的问题,现在一切似乎都正常。

马特