NinjectをMVC4に接続し、実際に依存関係を解決しようとしているところまで動作させています。ただし、次の例外が発生します。
メソッドが見つかりません:'System.Web.Http.Services.DependencyResolver System.Web.Http.HttpConfiguration.get_ServiceResolver()'。
誰かがこれに遭遇し、回避策がありますか?
NinjectをMVC4に接続し、実際に依存関係を解決しようとしているところまで動作させています。ただし、次の例外が発生します。
メソッドが見つかりません:'System.Web.Http.Services.DependencyResolver System.Web.Http.HttpConfiguration.get_ServiceResolver()'。
誰かがこれに遭遇し、回避策がありますか?
GlobalConfiguration.Configuration.ServiceResolver
GlobalConfiguration.Configuration.DependencyResolver
RCでに置き換えられました。したがって、使用しているNinjectパッケージは、RC用に設計されたものではないと思います。それは重大な変化の1つでした。
したがって、NinjectをASP.NET MVC 4 WebAPIRCで機能させる手順は次のとおりです。
インターフェイスを宣言します。
public interface IFoo
{
string GetBar();
}
次に、実装:
public class Foo : IFoo
{
public string GetBar()
{
return "the bar";
}
}
次に、APIコントローラーを追加します。
public class ValuesController : ApiController
{
private readonly IFoo _foo;
public ValuesController(IFoo foo)
{
_foo = foo;
}
public string Get()
{
return _foo.GetBar();
}
}
Ninject.Mvc3
NuGetパッケージをインストールします( Install-Package Ninject.Mvc3
)
この要点に示すように、カスタム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());
}
}
NuGetを~/App_Start/NinjectWebCommon.cs/CreateKernel
インストールしたときに作成したメソッドで、次の行を行の後に追加しますRegisterServices(kernel);
。
GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel);
カーネルを構成します。
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IFoo>().To<Foo>();
}
ヒットF5してに移動します/api/values
the bar
ます。Ninject.Mvc4
明らかに、RCがRTMにヒットしたときに、これらの10ステップを最大5に短縮するNuGetがあることを願っています。