用新的WCF Web API设置Ninject

本文关键字:API 设置 Ninject Web WCF | 更新日期: 2023-09-27 17:54:56

所以我一直在玩WCF Web API的最新版本,并决定我想要深入实现Ninject与它。

根据我所读到的,我需要实现接口IResourceFactory,它需要以下方法:

    public object GetInstance(System.Type serviceType, 
                              System.ServiceModel.InstanceContext instanceContext,
                              System.Net.Http.HttpRequestMessage request);
    public void ReleaseInstance(System.ServiceModel.InstanceContext instanceContext,
                                object service);

所以我删掉了以下内容:

public class NinjectResourceFactory : IResourceFactory
{
    private readonly IKernel _kernel;
    public NinjectResourceFactory()
    {
        var modules = new INinjectModule[]
                          {
                              new ServiceDIModule(),    //Service Layer Module
                              new RepositoryDIModule(), //Repo Layer Module
                              new DataServiceDIModule()
                          };
        _kernel = new StandardKernel(modules);
    }
    #region IResourceFactory Members
    public object GetInstance(Type serviceType,
                              InstanceContext instanceContext,
                              HttpRequestMessage request)
    {
        return Resolve(serviceType);
    }
    public void ReleaseInstance(InstanceContext instanceContext, object service)
    {
        throw new NotImplementedException();
    }
    #endregion
    private object Resolve(Type type)
    {
        return _kernel.Get(type);
    }
    //private T Resolve<T>()
    //{
    //    return _kernel.Get<T>();
    //}
    //private T Resolve<T>(string name)
    //{
    //    return _kernel.Get<T>(metaData => metaData.Has(name));
    //    return _kernel.Get<T>().Equals(With.Parameters.
    //                                   ContextVariable("name", name));
    //}
}

连接
var configuration = HttpHostConfiguration.Create().SetResourceFactory(new NinjectResourceFactory());
     RouteTable.Routes.MapServiceRoute<StateProvinceResource>("States", configuration);

令人惊讶的是,这似乎有效。我创建的第一个提供州/省列表的资源方法使用HTTP 200 OK生成输出。

那么,回答这个问题。是否有更简洁的方式来编写这个factory?我真的是糊弄过去了,感觉就是不对。我觉得我错过了一些显而易见的东西。我在新的Resolve方法中做的hack感觉特别脏,所以我想我应该利用那些更有经验的人来加强这一点。有没有其他人用WCF Web API实现了Ninject并实现了一个更简洁的解决方案?

谢谢你的建议!

用新的WCF Web API设置Ninject

您可以通过从应用程序作用域传入内核来实现它。

public class NinjectResourceFactory : IResourceFactory
{
    private readonly IKernel _kernel;
    public NinjectResourceFactory(IKernel kernel)
    {
        _kernel = kernel;
    }
    public object GetInstance(Type serviceType, InstanceContext instanceContext, HttpRequestMessage request)
    {
        return _kernel.Get(serviceType);
    }
    public void ReleaseInstance(InstanceContext instanceContext, object service)
    {
        // no op
    }
}