Подтвердить что ты не робот

Как разрешить ошибку: тип не реализует microsoft.practices.servicelocation.iservicelocator?

Я новичок в MVC, я следую за PRO ASP.NET MVC 4 от Адама Фримана. В настоящее время я работаю над своей шестой главой. В котором я изучаю, как использовать Ninject в 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(новый NinjectDependencyResolver()); эта строка я получаю ошибку:

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

Имя параметра: commonServiceLocator

Пожалуйста, помогите мне, как я могу решить эту ошибку.

Спасибо заранее.

4b9b3361

Ответ 1

Проблема в том, что ваш NinjectDependencyResolver не реализует интерфейс IDependencyResolver, а наследует от класса DependencyResolver. DependencyResolver не реализует IDependencyResolver, и это приводит к тому, что ваши собственные методы не связаны ни с чем, что знает MVC.

Просто измените на:

public class NinjectDependencyResolver : IDependencyResolver

Но, как говорит Ufuk Hacıoğulları, вы можете использовать официальный пакет Ninject.MVC3 NuGet для интеграции Ninject с MVC. Этот пакет создается разработчиками Ninject и зависит от основной библиотеки Ninject.

Ответ 2

Через год я столкнулся с одной и той же проблемой... Благодаря ответу 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

Ответ 3

Я сделал аналогичную ошибку в том же пункте. Я реализовал IDependencyResolver и получил идентичную ошибку. Это было вызвано неправильным утверждением "using" - в System.Web.Http есть аналогичный IDependencyResolver. Убедитесь, что вы используете System.Web.Mvc.

Ответ 4

Проблема может быть решена путем реализации интерфейса IDependencyResolver в классе StructureMapDependencyResolver.