2

NinjectをMVC4に接続し、実際に依存関係を解決しようとしているところまで動作させています。ただし、次の例外が発生します。

メソッドが見つかりません:'System.Web.Http.Services.DependencyResolver System.Web.Http.HttpConfiguration.get_ServiceResolver()'。

誰かがこれに遭遇し、回避策がありますか?

4

1 に答える 1

7

GlobalConfiguration.Configuration.ServiceResolverGlobalConfiguration.Configuration.DependencyResolverRCでに置き換えられました。したがって、使用しているNinjectパッケージは、RC用に設計されたものではないと思います。それは重大な変化の1つでした。

したがって、NinjectをASP.NET MVC 4 WebAPIRCで機能させる手順は次のとおりです。

  1. 空のテンプレートを使用して、新しいASP.NETMVC4アプリケーションを作成します
  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依存関係リゾルバーを定義します。

    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. NuGetを~/App_Start/NinjectWebCommon.cs/CreateKernelインストールしたときに作成したメソッドで、次の行を行の後に追加しますRegisterServices(kernel);

    GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel);
    
  8. カーネルを構成します。

    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<IFoo>().To<Foo>();
    }        
    
  9. ヒットF5してに移動します/api/values

  10. が表示されthe barます。

Ninject.Mvc4明らかに、RCがRTMにヒットしたときに、これらの10ステップを最大5に短縮するNuGetがあることを願っています。

于 2012-07-13T19:25:26.017 に答える