ASP.NET Web API - 500 Внутренняя ошибка сервера - Ninject DI - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть проект Aspnet Web API.Я использовал шаблон репозитория и хочу внедрить зависимости с помощью ninject, но он не работает.

Ninject.Web.Common.cs

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(ProjectName.API.App_Start.NinjectWebCommon), "Start")]

[assembly: WebActivatorEx.ApplicationShutdownMethodAttribute(typeof(ProjectName.API.App_Start.NinjectWebCommon), "Stop")]

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();
        try
        {
            kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
            kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
            RegisterServices(kernel);
            GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel);
            return kernel;
        }
        catch
        {
            kernel.Dispose();
            throw;
        }
    }

    /// <summary>
    /// Load your modules or register your services here!
    /// </summary>
    /// <param name="kernel">The kernel.</param>
    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<IFirstService>().To<ServiceManager>().WithConstructorArgument("firstServiceDAL", new EFFirstDAL());
    }        
}

Является ли класс Ninject.Web.Common правильным?Потому что он не работает.

Ответ моего API;

"Message": "An error has occurred.",
"ExceptionMessage": "An error occurred when trying to create a controller of type 'FirstController'. Make sure that the controller has a parameterless public constructor.",
"ExceptionType": "System.InvalidOperationException",

FirstController.cs - Конструктор моего контроллера

public class FirstController : ApiController
{
    private readonly IFirstService _firstService;

    public FirstController(IFirstService firstService)
    {
        this._firstService = firstService;
    }
}

Что я могу сделать?

1 Ответ

0 голосов
/ 26 февраля 2019

Кажется, у вас нет открытого конструктора без параметров. Ваш FirstController должен иметь открытый конструктор по умолчанию без параметров.Добавьте следующий код в ваш FirstController.

public FirstController()
{

}

Было бы лучше, если бы вы поделились своим контроллером.

 private static void RegisterServices(IKernel kernel)
 {
    kernel.Bind<IFirstService>().To<FirstService>();
 }
...