该类型似乎未实现 Microsoft.Practices.ServiceLocation.IServiceLocator

问题描述 投票:0回答:4

我是 MVC 新手,我正在关注“PRO ASP.NET MVC 4 by Adam Freeman”。我目前正在写第六章。在其中我正在学习如何使用 MVC 4 中的 Ninject 进行依赖注入。我已经按照书中所述创建了该应用程序。现在我不明白为什么会出现以下错误:

NinjectDependencyResolver 类型似乎没有实现 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<object> GetServices(Type serviceType) { return kernal.GetAll(serviceType); } private void AddBindings() { kernal.Bind<IValueCalculator>().To<LinqValueCalculator>(); } }
更改全局文件如下:

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());”这行我收到错误:

EssentialTools.Infrastruct.NinjectDependencyResolver 类型似乎未实现 Microsoft.Practices.ServiceLocation.IServiceLocator。 参数名称:commonServiceLocator

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

提前致谢。

c# asp.net asp.net-mvc-4 ninject ninject.web.mvc
4个回答
18
投票
一年后,我遇到了同样的问题......感谢 pdb 的回答,我可以找到解决方法。 在自定义

System.Web.Mvc.IDependencyResolver

 中强制使用 
System.Web.Http.Dependencies.IDependencyResolver
 而不是 
NinjectDependencyResolver
 会导致代码其他部分需要 
System.Web.Http.Dependencies.IDependencyResolver
 时出现强制转换问题。例如,当您尝试概括自定义 DI 时:

GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel)

就我而言,我实现了两个

IDependencyResolver

,它的工作原理如下:

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

17
投票
问题是你的

NinjectDependencyResolver

没有实现
IDependencyResolver
接口,而是继承自
DependencyResolver
类。 
DependencyResolver
 没有实现 
IDependencyResolver
,这会导致您自己的方法与 MVC 知道的任何内容无关。

只需更改为:

public class NinjectDependencyResolver : IDependencyResolver

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


6
投票
我在同一点犯了类似的错误。我已经实现了

IDependencyResolver

 并得到了相同的错误。这是由错误的“使用”语句引起的 - 
IDependencyResolver
中有类似的
System.Web.Http
。检查您正在使用 
System.Web.Mvc


0
投票
这个问题可以通过在

IDependencyResolver

 类上实现 
StructureMapDependencyResolver
 接口来解决。

© www.soinside.com 2019 - 2024. All rights reserved.