如何解决错误:该类型似乎没有实现microsoft.practices.servicelocation.iservicelocator?

我是MVC的新手,我正在关注Adam Freeman的PRO ASP.NET MVC 4 ”。 我目前正在编写第6章。 我正在学习如何在MVC 4中使用Ninject进行dependency injection。 我按照书中的描述创建了应用程序。 现在我无法得到以下错误的原因:

该类型似乎没有实现microsoft.practices.servicelocation.iservicelocator

这是我的控制器代码:

public class HomeController : Controller { private Product[] products = { new Product {Name = "Kayak", Category = "Watersports", Price = 275M}, new Product {Name = "Lifejacket", Category = "Watersports", Price = 48.95M}, new Product {Name = "Soccer ball", Category = "Soccer", Price = 19.50M}, new Product {Name = "Corner flag", Category = "Soccer", Price = 34.95M} }; private IValueCalculator calc; public HomeController(IValueCalculator calcParam) { calc = calcParam; } public ActionResult Index() { ShoppingCart cart = new ShoppingCart(calc) { Products = products }; decimal totalvalue = cart.CalculateProductTotal(); return View(totalvalue); } } 

我创建了一个名为“NinjectDependencyResolver”的类,如下所示:

 public class NinjectDependencyResolver : DependencyResolver { private IKernel kernal; public NinjectDependencyResolver() { kernal = new StandardKernel(); AddBindings(); } public object GetService(Type serviceType) { return kernal.TryGet(serviceType); } public IEnumerable GetServices(Type serviceType) { return kernal.GetAll(serviceType); } private void AddBindings() { kernal.Bind().To(); } } 

更改了全局文件,如下所示:

 public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); DependencyResolver.SetResolver( new NinjectDependencyResolver()); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); } } 

在“DependencyResolver.SetResolver(new NinjectDependencyResolver());” 这行我得到的错误:

 he type EssentialTools.Infrastructure.NinjectDependencyResolver does not appear to implement Microsoft.Practices.ServiceLocation.IServiceLocator. 

参数名称:commonServiceLocator

请帮帮我,我该如何解决这个错误。

提前致谢。

问题是您的NinjectDependencyResolver不实现IDependencyResolver接口,而是inheritance自DependencyResolver类。 DependencyResolver不实现IDependencyResolver ,这会导致您自己的方法与MVC知道的任何内容无关。

只需改为:

 public class NinjectDependencyResolver : IDependencyResolver 

但正如UfukHacıoğulları所说,您可以使用官方的Ninject.MVC3 NuGet包将Ninject与MVC集成。 这个包由Ninject的开发人员创建,依赖于Ninject核心库。

一年之后,我想到了同样的问题……感谢pdb的回答,我找到了解决办法。 在自定义的NinjectDependencyResolver强制System.Web.Mvc.IDependencyResolver而不是System.Web.Http.Dependencies.IDependencyResolver导致在代码的其他部分需要System.Web.Http.Dependencies.IDependencyResolver情况下出现转换问题。 例如,当您尝试概括自定义DI时:

 GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel) 

在我的例子中,我实现了两个IDependencyResolver ,它的工作IDependencyResolver如下:

 public class NinjectDependencyResolver : NinjectDependencyScope, IDependencyResolver, System.Web.Mvc.IDependencyResolver 

我在同一点犯了类似的错误。 我已经实现了IDependencyResolver并得到了相同的错误。 它是由错误的’using’语句引起的 – 在System.Web.Http有一个类似的IDependencyResolver 。 检查您使用的是System.Web.Mvc

可以通过在StructureMapDependencyResolver类上实现IDependencyResolver接口来解决该问题。