9

谁能指出我正确的方向来让 Ninject 使用 WCF Web API Preview 5?我在我的 ASP.NET MVC 3 项目以及另一个使用 Ninject.Extensions.Wcf 库的内部 WCF 服务中成功启动并运行了它。但是,在创建新的 MVC 3 项目并从 NuGet 获取 WebApi.All 库时,我无法让它工作。

我已经查看了这篇 stackoverflow 帖子Setting up Ninject with the new WCF Web API但无法使其正常工作,我认为这可能与最新版本中的一些更改有关。

我也不确定除了主要的 Ninject 库之外还可以引用哪些 Ninject 库。我是否使用 Ninject.MVC3、Ninject.Extensions.Wcf。

对此的任何帮助将不胜感激。

****更新**

我正在使用的代码来自上述问题的答案。我在它自己的类文件中有这个。

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

这是我在 global.asax 中的:

var configuration = HttpConfiguration.Create().SetResourceFactory(new NinjectResourceFactory());
RouteTable.Routes.MapServiceRoute<myResource>("resource", configuration);

我遇到的问题是 IResourceFactory 接口无法识别并且 HttpConfiguration.Create() 不再存在,所以我需要设置 SetResourceFactory 其他方式,我尝试使用 HttpConfiguration().CreateInstance 方法但没有喜悦。

4

3 回答 3

9

以下是我使用 Ninject 和 WebApi 编写的代码,它可以工作。创建一个继承自 WebApiConfiguration 的类

public class NinjectWebApiConfiguration : WebApiConfiguration {
    private IKernel kernel = new StandardKernel();

    public NinjectWebApiConfiguration() {
        AddBindings();
        CreateInstance = (serviceType, context, request) => kernel.Get(serviceType);
    }

    private void AddBindings() {
        kernel.Bind<IProductRepository>().To<MockProductRepository>();
    }

}

并在 RegisterRoutes 中使用 NinjectWebApiConfiguration

public static void RegisterRoutes(RouteCollection routes) {

    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    var config = new NinjectWebApiConfiguration() { 
        EnableTestClient = true
    };

    routes.MapServiceRoute<ContactsApi>("api/contacts", config);
}
于 2011-10-11T09:21:10.607 回答
4

在 P5 中,您必须从 WebApiConfiguration 派生并使用派生的配置:

public class NinjectConfiguration : WebApiConfiguration
    {
        public NinjectConfiguration(IKernel kernel)
        {
            CreateInstance((t, i, m) =>
            {
                return kernel.Get(t);
            }); 
        }
    }
于 2011-09-30T12:55:02.783 回答
3

这里的问题有很好的答案,但我想向您展示使用默认 WebApi 配置的方式:

    protected void Application_Start(object sender, EventArgs e) {

        RouteTable.Routes.SetDefaultHttpConfiguration(new Microsoft.ApplicationServer.Http.WebApiConfiguration() { 
            CreateInstance = (serviceType, context, request) => GetKernel().Get(serviceType)
        });

        RouteTable.Routes.MapServiceRoute<People.PeopleApi>("Api/People");
    }

    private IKernel GetKernel() { 

        IKernel kernel = new StandardKernel();

        kernel.Bind<People.Infrastructure.IPeopleRepository>().
            To<People.Models.PeopleRepository>();

        return kernel;
    }

下面的博客文章稍微介绍了 WCF Web API 上的 Ninject 集成:

http://www.tugberkugurlu.com/archive/introduction-to-wcf-web-api-new-rest-face-ofnet

于 2011-11-21T10:39:42.650 回答