HttpConfiguration.get_ServiceResolver()缺少

Vul*_*ary 2 c# ninject asp.net-mvc-4

我正在使用MVC4连接Ninject并让它正在努力实际解决依赖关系.但是,我得到以下异常:

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

任何人遇到这个并有一个解决方案吗?

Dar*_*rov 7

GlobalConfiguration.Configuration.ServiceResolver被替换GlobalConfiguration.Configuration.DependencyResolver为RC.所以我猜你使用的Ninject包根本就不是为RC而设计的.这是一个突破性的变化.

以下是使Ninject与ASP.NET MVC 4 Web API RC一起工作的步骤:

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

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

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

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

  6. 定义一个定制的API依赖解析器如图这一要点:

    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());
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  7. ~/App_Start/NinjectWebCommon.cs/CreateKernel安装NuGet时创建的方法中,在行后面添加以下RegisterServices(kernel);行:

    GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel);
    
    Run Code Online (Sandbox Code Playgroud)
  8. 配置你的内核:

    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<IFoo>().To<Foo>();
    }        
    
    Run Code Online (Sandbox Code Playgroud)
  9. 点击F5并导航到/api/values

  10. 你得到了the bar.

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