【问题标题】:Setting up Ninject with the new WCF Web API使用新的 WCF Web API 设置 Ninject
【发布时间】:2011-08-19 20:28:37
【问题描述】:

所以我一直在玩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 的输出。

所以,对于这个问题。有没有一种 cleaner 的方式来编写这个工厂?我真的糊涂了,感觉不对。我觉得我错过了一些明显盯着我的脸。我在新的 Resolve 方法中进行的 hack 感觉特别脏,所以我想我会利用那些更有经验的人来加强这一点。有其他人使用 WCF Web API 实现了 Ninject 并实现了更简洁的解决方案吗?

感谢您的任何意见!

【问题讨论】:

  • 这看起来和我用结构图做的事情比较相似。传递对象总是感觉有点 hacky,但如果它是框架给你的,除了滚动你自己的之外,还有什么选择。

标签: c# .net ninject ioc-container wcf-web-api


【解决方案1】:

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

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
    }
}

【讨论】:

  • 是的,这对工厂进行了相当大的清理。我真正试图归零的部分是 Resolve 方法被逼迫返回一个对象而不是一个类型化的结果,但我想这个实现将不得不做,直到/如果微软团队修改了返回值。
  • IResourceFactory 是从哪里来的?这是一个 Web API 接口吗?我试图让它与 Web API 的 Preview 5 一起工作,但没有任何运气?您是否使用了 Ninject.MVC 或 WCF 扩展或两者都使用?谢谢。
  • @Cragly 我认为这个答案适用于预览版 3,不适用于预览版 5
猜你喜欢
  • 1970-01-01
  • 2014-09-25
  • 2013-08-14
  • 2011-03-28
  • 1970-01-01
  • 2014-06-23
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
相关资源
最近更新 更多