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

Я новичок в MVC, я слежу за "PRO ASP.NET MVC 4 от Адама Фримена". Сейчас я работаю над 6-й главой. В котором я узнаю, как использовать 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

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

Заранее спасибо.


person Ram Singh    schedule 28.08.2013    source источник
comment
Вы также можете использовать пакет Ninject.MVC3, который легче интегрировать. Он поддерживает MVC4.   -  person Ufuk Hacıoğulları    schedule 28.08.2013
comment
@UfukHacıoğulları почему? есть ли проблема с контейнером Ninject Ioc для .NET   -  person Ram Singh    schedule 28.08.2013
comment
Нет, он использует тот же пакет Ninject. Это упрощает интеграцию с приложением MVC.   -  person Ufuk Hacıoğulları    schedule 28.08.2013
comment
выше ошибка из-за этого? @UfukHacıoğulları   -  person Ram Singh    schedule 28.08.2013
comment
Нет, вы не используете этот пакет. Вы интегрируете его вручную.   -  person Ufuk Hacıoğulları    schedule 28.08.2013
comment
@UfukHacıoğulları, спасибо, я совершил глупую ошибку. большое спасибо   -  person Ram Singh    schedule 28.08.2013


Ответы (4)


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

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

public class NinjectDependencyResolver : IDependencyResolver

Но, как говорит Уфук Хаджиогуллары, вы можете использовать официальный пакет Ninject.MVC3 NuGet для интеграции Ninject с MVC. Этот пакет создан разработчиками Ninject и зависит от базовой библиотеки Ninject.

person Steven    schedule 28.08.2013
comment
Спасибо, чувак, я тоже буду использовать NinJect MVC3 - person Ram Singh; 28.08.2013
comment
Я использую Pro ASP.NET MVC 5, самую последнюю версию книги (опубликована в 2013 году). Он использует родительский класс IDependencyResolver, как показано в ответе Стивена. К сожалению для меня, я пропустил это при вводе кода и оказался на этом ТАК вопросе :-). - person Phil Ringsmuth; 16.02.2016
comment
В классе NinjectDependencyResolver также убедитесь, что вы ссылаетесь на System.Web.Mvc, я по ошибке использовал System.Web.Http.Dependencies, поскольку это было предложение, которое я получил от Resharper. - person Gedeon; 23.09.2016

Через год я столкнулся с той же проблемой... Благодаря ответу 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
person ahqepha    schedule 10.07.2014
comment
Точно проблема у меня была! Спасибо, это отличное решение, и оно отлично сработало для меня. - person JCisar; 04.10.2017

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

person pdb    schedule 30.01.2014

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

person Edgar Leonardo Perez    schedule 15.09.2017