11

我被困住了。我使用此处概述的方法用于 wcf web api p6 Ninject 与 WCF Web API Preview 5 一起使用,但是与测试版中的 mvc 实现有很大不同。这里有一篇很好的文章http://www.asp.net/web-api/overview/extensibility/using-the-web-api-dependency-resolver讨论了构建自己的自定义依赖解析器,但是我想使用与我的 mvc 视图控制器相同的实现...例如 Ninject。我也根据文章中的 IoC Unity 示例尝试了一些事情,但还没有成功。任何为我指明正确方向的帮助将不胜感激。我也将继续自己挖掘。提前致谢!

这就是我所在的地方。我使用 WebActivator 来引导代码,但我已经将它放到 Application_Start() 中,只是为了摆脱等式。

    protected void Application_Start()
    {
        var kernel = new StandardKernel(new MyNinjectModule());
        GlobalConfiguration.Configuration.ServiceResolver.SetResolver(new NinjectDependencyResolver(kernel));
    }

并且收到以下错误:
Ninject.Web.Mvc.NinjectDependencyResolver 类型似乎没有实现 Microsoft.Practices.ServiceLocation.IServiceLocator。
参数名称:commonServiceLocator

找到解决方案
也许有/将会有一种更优雅的方式,但这现在对我有用。我也在这里添加了我的自定义消息处理程序。

[assembly: WebActivator.PreApplicationStartMethod(typeof(MyApp.AppStart.ApiBootstrapper), "Start")]
namespace MyApp.AppStart
{
    public class ApiBootstrapper
    {
        public static void Start()
        {
            var kernel = new StandardKernel(new MyNinjectModule());
            var resolver = new NinjectDependencyResolver(kernel);
            GlobalConfiguration.Configuration.ServiceResolver.SetResolver(resolver.GetService, resolver.GetServices);
            GlobalConfiguration.Configuration.MessageHandlers.Add(new ApiAuthHandler());
        }
    }
}
4

5 回答 5

3

我从未使用过 WebAPI,但由于 IDependencyResolver 的语义与 MVC3 中的语义完全相同,因此您应该能够使用相同的实现:https ://github.com/ninject/ninject.web.mvc/blob/master /mvc3/src/Ninject.Web.Mvc/NinjectDependencyResolver.cs

更新:Ninject.Web.WebAPi 扩展增加了对 ApiControllers 的支持

于 2012-02-23T17:16:45.527 回答
1

我找到了答案并用解决方案更新了我上面的问题。解决方案本身或多或少出现在Using the Web API Dependency Resolver文章中,我只需要继续调整 ninject。这两个答案都帮助我迅速缩小了范围,感谢@Remo 和@James。

于 2012-02-24T00:45:22.317 回答
0

听起来可能很傻,但您确定您有对 CommonServiceLocator / CommonServiceLocator.NinjectAdapter nuget 包或相关程序集的引用。您的 NinjectDependencyResolver 可能无法解析对 IServiceLocator 的引用。

于 2012-02-23T19:08:19.387 回答
0

相同的代码适用于 MVC 和 WebApi,但是因为 WebApi 是受 MVC 启发的,并且不必引用 MVC 程序集才能使用 WebApi(反之亦然),因此存在大量重复代码两个框架之间。如果你想使用 MVC,你的依赖将来自System.Web.Mvc,如果你想使用 WebApi,你将使用System.Web.Http. 如果您想同时使用两者,则必须使用更明确的命名空间解析来区分何时使用的代码。

在您的情况下,您的问题是 MVC 首先出现,并且NinjectDependancyResolver该类继承自System.Web.Mvc.IDependencyResolver. 您将希望创建 NinjectDependancyResolver 类的精确副本,而是从其继承System.Web.Http.IDependencyResolver。使用这个类来设置你的 IoC,你会很高兴的。

于 2012-02-24T23:29:15.110 回答
0

我在这里找到了一个不错的解决方案。

如果您已经在使用 Ninject CommonServiceLocator / Bootstrapper,这很容易:

private static IKernel CreateKernel() {
   var kernel = new StandardKernel();
   RegisterServices(kernel);

   GlobalConfiguration.Configuration.ServiceResolver
      .SetResolver(new NinjectServiceLocator(kernel));
   return kernel; 
}
于 2012-03-30T14:09:34.840 回答