如何解决错误:该类型似乎没有实现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
接口来解决该问题。