При частичном запуске Owin не работает привязка Ninject - PullRequest
0 голосов
/ 26 апреля 2020

Я создаю приложение Web Api 2 в ASP. NET. Я сделал Авторизацию с использованием токенов JWT и промежуточного программного обеспечения Owin. Теперь при генерации токенов мне нужно сначала проверить учетные данные пользователя через БД. Для этого мне нужно внедрение зависимости конструктора. До сих пор я делал:

Класс частичного запуска Owin

[assembly: OwinStartup(typeof(CampBookingApplication.App_Start.Startup))]

namespace CampBookingApplication.App_Start
{
    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            var kernel = ConfigureNinject(app);
            ConfigureAuth(app, kernel);
        }

        public void ConfigureAuth(IAppBuilder app, IKernel kernel)
        {
            app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
            app.UseOAuthAuthorizationServer(kernel.Get<MyOAuthProvider>().GetOptions());
            app.UseJwtBearerAuthentication(new MyJwtOptions());
        }
    }
}

Класс Startup.Ninject

namespace CampBookingApplication.App_Start
{
    public partial class Startup
    {
        public IKernel ConfigureNinject(IAppBuilder app)
        {
            var config = new HttpConfiguration();
            var kernel = CreateKernel();
            app.UseNinjectMiddleware(CreateKernel);
            app.UseNinjectWebApi(config);
            return kernel;
        }

        public IKernel CreateKernel()
        {
            var kernel = new StandardKernel();
            try
            {
                RegisterServices(kernel); return kernel;
            }
            catch
            {
                kernel.Dispose(); throw;
            }
        }

        private static void RegisterServices(IKernel kernel)
        {
            kernel.Bind<IUserService>().To<UserService>().InSingletonScope();
            kernel.Bind<ICampService>().To<CampService>().InSingletonScope();
            kernel.Bind<IBookingService>().To<BookingService>().InSingletonScope();
        }
    }
}

При обращении к API я всегда получаю сообщение об ошибке:

"Произошла ошибка при попытке создать контроллер типа 'CampsController'. Убедитесь, что контроллер имеет параметр без публикации c конструктор. ",

Это означает, что я не могу зарегистрировать свои привязки. Что я делаю неправильно?

Я много раз искал, но не смог решить эту проблему.

ОБНОВЛЕНИЕ 1:
Я прилагаю всю трассировку исключений с кодом контроллера.

Вся трассировка исключений:

{
    "Message": "An error has occurred.",
    "ExceptionMessage": "An error occurred when trying to create a controller of type 'CampsController'. Make sure that the controller has a parameterless public constructor.",
    "ExceptionType": "System.InvalidOperationException",
    "StackTrace": "   at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)\r\n   at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)\r\n   at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__15.MoveNext()",
    "InnerException": {
        "Message": "An error has occurred.",
        "ExceptionMessage": "Type 'CampBookingApplication.Controllers.CampsController' does not have a default constructor",
        "ExceptionType": "System.ArgumentException",
        "StackTrace": "   at System.Linq.Expressions.Expression.New(Type type)\r\n   at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType)\r\n   at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator)\r\n   at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"
    }
}

CampsController:

public class CampsController : ApiController
    {
        private readonly ICampService _campService;

        public CampsController(ICampService campService)
        {
            _campService = campService;
        }


        [HttpGet]
        [Authorize]
        public IHttpActionResult GetAllCamps()
        {
            List<CampDTO> camps = _campService.GetAllCamps();
            if (camps.Count == 0)
            {
                return NotFound();
            }
            return Ok(camps);
        }
        ....
    }
...