20

我是 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);
    }
}

我创建了一个名为“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

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

提前致谢。

4

4 回答 4

17

一年后,我遇到了同样的问题......感谢pdb的回答,我可以找到解决方法。在代码System.Web.Mvc.IDependencyResolver的其他部分需要. 例如,当您尝试概括自定义 DI 时:System.Web.Http.Dependencies.IDependencyResolverNinjectDependencyResolverSystem.Web.Http.Dependencies.IDependencyResolver

GlobalConfiguration.Configuration.DependencyResolver =
    new NinjectDependencyResolver(kernel)

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

public class NinjectDependencyResolver
    : NinjectDependencyScope
    , IDependencyResolver
    , System.Web.Mvc.IDependencyResolver
于 2014-07-10T23:27:40.167 回答
16

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

只需更改为:

public class NinjectDependencyResolver : IDependencyResolver

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

于 2013-08-28T11:39:13.650 回答
6

我在同一点犯了类似的错误。我已经实施IDependencyResolver并得到了相同的错误。这是由错误的 'using' 语句引起的 -IDependencyResolverSystem.Web.Http. 检查您正在使用System.Web.Mvc.

于 2014-01-30T14:53:48.397 回答
0

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

于 2017-09-15T19:02:30.830 回答