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

Ram*_*ngh 15 c# asp.net ninject ninject.web.mvc asp.net-mvc-4

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

该类型似乎没有实现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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我创建了一个名为"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>();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

he type EssentialTools.Infrastructure.NinjectDependencyResolver does not appear to implement Microsoft.Practices.ServiceLocation.IServiceLocator.
Run Code Online (Sandbox Code Playgroud)

参数名称:commonServiceLocator

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

提前致谢.

Ste*_*ven 14

问题是你NinjectDependencyResolver没有实现IDependencyResolver接口,而是继承自DependencyResolver类.在DependencyResolver没有实现IDependencyResolver,这将导致自己的方法是无关的任何MVC知道.

只需改为:

public class NinjectDependencyResolver : IDependencyResolver
Run Code Online (Sandbox Code Playgroud)

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


小智 14

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

GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel)
Run Code Online (Sandbox Code Playgroud)

就我而言,我实现了两者IDependencyResolver,它的工作原理如下:

public class NinjectDependencyResolver : NinjectDependencyScope, IDependencyResolver, System.Web.Mvc.IDependencyResolver
Run Code Online (Sandbox Code Playgroud)


小智 6

我在同一点犯了类似的错误.我已经实现IDependencyResolver并得到了相同的错误.它是由错误的"使用"声明引起的 - 有一个类似IDependencyResolverSystem.Web.Http.检查你正在使用System.Web.Mvc.