HttpConfiguration.get_ServiceResolver() 丢失

2024-04-19

我正在将 Ninject 与 MVC4 连接起来,并使其工作到尝试实际解决依赖关系的程度。但是,我收到以下异常:

找不到方法:“System.Web.Http.Services.DependencyResolver System.Web.Http.HttpConfiguration.get_ServiceResolver()”。

有人遇到过这个问题并有解决办法吗?


GlobalConfiguration.Configuration.ServiceResolver被替换为GlobalConfiguration.Configuration.DependencyResolver在RC。所以我猜你使用的 Ninject 包根本就不是为 RC 设计的。这是重大变化之一。

以下是使 Ninject 与 ASP.NET MVC 4 Web API RC 配合使用的步骤:

  1. 使用空模板创建新的 ASP.NET MVC 4 应用程序
  2. 声明一个接口:

    public interface IFoo
    {
        string GetBar();
    }
    
  3. 然后是一个实现:

    public class Foo : IFoo
    {
        public string GetBar()
        {
            return "the bar";
        }
    }
    
  4. 然后添加一个API控制器:

    public class ValuesController : ApiController
    {
        private readonly IFoo _foo;
        public ValuesController(IFoo foo)
        {
            _foo = foo;
        }
    
        public string Get()
        {
            return _foo.GetBar();
        }
    }
    
  5. 安装Ninject.Mvc3NuGet 包(Install-Package Ninject.Mvc3)

  6. 定义自定义 API 依赖解析器,如下所示这个要点 https://gist.github.com/2417226:

    public class NinjectDependencyScope : IDependencyScope
    {
        private IResolutionRoot resolver;
    
        internal NinjectDependencyScope(IResolutionRoot resolver)
        {
            Contract.Assert(resolver != null);
    
            this.resolver = resolver;
        }
    
        public void Dispose()
        {
            IDisposable disposable = resolver as IDisposable;
            if (disposable != null)
                disposable.Dispose();
    
            resolver = null;
        }
    
        public object GetService(Type serviceType)
        {
            if (resolver == null)
                throw new ObjectDisposedException("this", "This scope has already been disposed");
    
            return resolver.TryGet(serviceType);
        }
    
        public IEnumerable<object> GetServices(Type serviceType)
        {
            if (resolver == null)
                throw new ObjectDisposedException("this", "This scope has already been disposed");
    
            return resolver.GetAll(serviceType);
        }
    }
    
    public class NinjectDependencyResolver : NinjectDependencyScope, IDependencyResolver
    {
        private IKernel kernel;
    
        public NinjectDependencyResolver(IKernel kernel)
            : base(kernel)
        {
            this.kernel = kernel;
        }
    
        public IDependencyScope BeginScope()
        {
            return new NinjectDependencyScope(kernel.BeginBlock());
        }
    }
    
  7. In your ~/App_Start/NinjectWebCommon.cs/CreateKernel安装 NuGet 时创建的方法,在后面添加以下行RegisterServices(kernel); line:

    GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel);
    
  8. 配置你的内核:

    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<IFoo>().To<Foo>();
    }        
    
  9. Hit F5 and navigate to /api/values

  10. 您将看到the bar.

显然,当 RC 达到 RTM 时,我希望会有一个Ninject.Mvc4NuGet 会将这 10 个步骤缩短到最多 5 个。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HttpConfiguration.get_ServiceResolver() 丢失 的相关文章

随机推荐