Как разрешить ошибку: тип не реализует 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
Пожалуйста, помогите мне, как я могу решить эту ошибку.
Спасибо заранее.
Ответы
Ответ 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
.