【问题标题】:How to resolve error :the type does not appear to implement microsoft.practices.servicelocation.iservicelocator?如何解决错误:该类型似乎没有实现 microsoft.practices.servicelocation.iservicelocator?
【发布时间】:2013-08-31 10:07:46
【问题描述】:

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

该类型似乎没有实现 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());”这行我得到了错误:

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

参数名称:commonServiceLocator

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

提前致谢。

【问题讨论】:

  • 您也可以使用更容易集成的 Ninject.MVC3 包。它支持 MVC 4。
  • @UfukHacıoğulları 为什么? “Ninject Ioc container for .NET”有什么问题
  • 不,它使用相同的 Ninject 包。它简化了与 MVC 应用程序的集成。
  • 上述错误是不是因为这个? @UfukHacıoğulları
  • 不,你没有使用那个包。您正在手动集成它。

标签: c# asp.net asp.net-mvc-4 ninject ninject.web.mvc


【解决方案1】:

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

GlobalConfiguration.Configuration.DependencyResolver =
    new NinjectDependencyResolver(kernel)

就我而言,我同时实现了IDependencyResolver,它的工作原理是这样的:

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

【讨论】:

  • 我遇到的确切问题!谢谢,这是一个很好的解决方案,对我来说非常有效。
【解决方案2】:

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

只需更改为:

public class NinjectDependencyResolver : IDependencyResolver

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

【讨论】:

  • 谢谢老兄,我也会.. 使用 NinJect MVC3
  • 我正在使用 Pro ASP.NET MVC 5,这是本书的最新版本(2013 年出版)。它确实使用了 IDependencyResolver 的父类,如 Steven 的回答所示。对我来说不幸的是,我在输入代码时错过了它,并最终提出了这个 SO 问题:-)。
【解决方案3】:

我在同一点犯了类似的错误。我已经实现了IDependencyResolver 并得到了相同的错误。这是由错误的“使用”语句引起的 - 在System.Web.Http 中有一个类似的IDependencyResolver。检查你使用的是System.Web.Mvc

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-25
      • 2019-09-11
      • 2022-11-01
      • 2016-02-11
      • 2011-10-24
      • 2015-01-06
      • 2018-07-25
      • 1970-01-01
      相关资源
      最近更新 更多