我正在将 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 配合使用的步骤:
- 使用空模板创建新的 ASP.NET MVC 4 应用程序
-
声明一个接口:
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 依赖解析器,如下所示这个要点 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());
}
}
-
In your ~/App_Start/NinjectWebCommon.cs/CreateKernel
安装 NuGet 时创建的方法,在后面添加以下行RegisterServices(kernel);
line:
GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel);
-
配置你的内核:
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IFoo>().To<Foo>();
}
Hit F5 and navigate to /api/values
- 您将看到
the bar
.
显然,当 RC 达到 RTM 时,我希望会有一个Ninject.Mvc4
NuGet 会将这 10 个步骤缩短到最多 5 个。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)