NinjectWebCommon Bindings в RegisterServices не работает для меня в WebApi - PullRequest
4 голосов
/ 01 апреля 2012

Я создаю новый проект ASP.NET Web API.Затем я использую nuget для извлечения Ninject.Web.Common, затем загружаю и собираю Ninject.Web.WebApi из здесь .Включил это в проект.Я добавил службу и внедрение через конструктор, привязку настройки (отладчик показывает, что код действительно выполняет привязку), но все равно выдает эту ошибку:

Error activating IValueService
No matching bindings are available, and the type is not self-bindable.
Activation path:
  2) Injection of dependency IValueService into parameter valueService of constructor of type ValuesController
  1) Request for ValuesController

Suggestions:
  1) Ensure that you have defined a binding for IValueService.
  2) If the binding was defined in a module, ensure that the module has been loaded into the kernel.
  3) Ensure you have not accidentally created more than one kernel.
  4) If you are using constructor arguments, ensure that the parameter name matches the constructors parameter name.
  5) If you are using automatic module loading, ensure the search path and filters are correct.

Библиотеки в моем проекте:

  1. Ninject.dll
  2. Ninject.Web.Common
  3. Ninject.Web.Webapi
  4. WebActivator

Все библиотеки Nectject помечены какверсия 3.

Вот код:

[assembly: WebActivator.PreApplicationStartMethod(typeof(MvcApplication3.App_Start.NinjectWebCommon), "Start")]
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(MvcApplication3.App_Start.NinjectWebCommon), "Stop")]
namespace MvcApplication3.App_Start
{
using System;
using System.Web;

using Microsoft.Web.Infrastructure.DynamicModuleHelper;

using Ninject;
using Ninject.Web.Common;

public static class NinjectWebCommon 
{
    private static readonly Bootstrapper bootstrapper = new Bootstrapper();

    /// <summary>
    /// Starts the application
    /// </summary>
    public static void Start() 
    {
        DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
        DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
        bootstrapper.Initialize(CreateKernel);
    }

    /// <summary>
    /// Stops the application.
    /// </summary>
    public static void Stop()
    {
        bootstrapper.ShutDown();
    }

    /// <summary>
    /// Creates the kernel that will manage your application.
    /// </summary>
    /// <returns>The created kernel.</returns>
    private static IKernel CreateKernel()
    {
        var kernel = new StandardKernel();
        kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
        kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

        RegisterServices(kernel);
        return kernel;
    }

    /// <summary>
    /// Load your modules or register your services here!
    /// </summary>
    /// <param name="kernel">The kernel.</param>
    private static void RegisterServices(IKernel kernel)
    {

        kernel.Bind<IValueService>().To<ValueService>();
    }        
}

}

сервис:

public interface IValueService
{
    List<string> GetStrings();
}

public class ValueService : IValueService
{
    public List<string> GetStrings()
    {
        return new List<string>{"test", "test"};
    }
}

контроллер:

public class ValuesController : ApiController
{
    private readonly IValueService valueService;

    // GET /api/values
    public ValuesController(IValueService valueService)
    {
        this.valueService = valueService;
    }
}

Загруженный пример проекта сgithub работает, но не когда я создаю новый проект.Я пропускаю шаг?

Ответы [ 2 ]

5 голосов
/ 01 апреля 2012

Я только что проверил, что нет проблем с этим расширением (по крайней мере, с последним просмотром MVC4):

  • Создание нового проекта MVC4 WEB Api
  • Nuget Install-Package Ninject.Web.WebAPI
  • Изменить контроллер + добавить привязки

Ваш код выглядит хорошо. Должна быть проблема где-то еще.

0 голосов
/ 19 ноября 2015

Не привязывайте напрямую в RegisterServices, но сначала создайте класс из IDependencyResolver и добавьте свои привязки в AddBindings

пример

См. В книге Pro ASP.NET MVC5 от Адама Фримена

...