我是 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请帮助我,我该如何解决这个错误。
提前致谢。
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
NinjectDependencyResolver
没有实现
IDependencyResolver
接口,而是继承自
DependencyResolver
类。
DependencyResolver
没有实现
IDependencyResolver
,这会导致您自己的方法与 MVC 知道的任何内容无关。只需更改为:
public class NinjectDependencyResolver : IDependencyResolver
但正如 Ufuk Hacıoğulları 所说,您可以使用官方 Ninject.MVC3 NuGet 包将 Ninject 与 MVC 集成。该包由 Ninject 的开发人员创建,依赖于 Ninject 核心库。
IDependencyResolver
并得到了相同的错误。这是由错误的“使用”语句引起的 -
IDependencyResolver
中有类似的
System.Web.Http
。检查您正在使用
System.Web.Mvc
。
IDependencyResolver
类上实现
StructureMapDependencyResolver
接口来解决。