Vul*_*ary 2 c# ninject asp.net-mvc-4
我正在使用MVC4连接Ninject并让它正在努力实际解决依赖关系.但是,我得到以下异常:
找不到方法:'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一起工作的步骤:
声明一个接口:
public interface IFoo
{
string GetBar();
}
Run Code Online (Sandbox Code Playgroud)然后是一个实现:
public class Foo : IFoo
{
public string GetBar()
{
return "the bar";
}
}
Run Code Online (Sandbox Code Playgroud)然后添加一个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)安装Ninject.Mvc3NuGet包(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());
}
}
Run Code Online (Sandbox Code Playgroud)在~/App_Start/NinjectWebCommon.cs/CreateKernel安装NuGet时创建的方法中,在行后面添加以下RegisterServices(kernel);行:
GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel);
Run Code Online (Sandbox Code Playgroud)配置你的内核:
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IFoo>().To<Foo>();
}
Run Code Online (Sandbox Code Playgroud)点击F5并导航到/api/values
the bar.显然,当RC点击RTM时,我希望会有一个Ninject.Mvc4NuGet将这10个步骤缩短到最多5个.