InvalidOperationException при внедрении в контроллеры API с помощью Ninject и Web API 2.1

1

У меня в настоящее время возникают проблемы с тем, чтобы Ninject вводил зависимости в мои контроллеры API. Я использую веб-проект с MVC 5, Web API 2.1 и SignalR 2. Я использую версию 5.1.2 веб-API, версия 3.2.2 Ninject и версию 3.2.1 из Ninject.Web.WebApi.Webhost. Каждый раз, когда я делаю запрос против API, я получаю эту ошибку:

    System.InvalidOperationException: An error occurred when trying to create a controller of type 'AccountsController'. Make sure that the controller has a parameterless public constructor. ---> System.NullReferenceException: Object reference not set to an instance of an object.
   at Ninject.Planning.Bindings.BindingConfiguration.GetProvider(IContext context)
   at Ninject.Planning.Bindings.Binding.GetProvider(IContext context)
   at Ninject.Activation.Context.GetProvider()
   at Ninject.Activation.Context.ResolveInternal(Object scope)
   at Ninject.Activation.Context.Resolve()
   at Ninject.KernelBase.<>c__DisplayClass15.<Resolve>b__f(IBinding binding)
   at System.Linq.Enumerable.WhereSelectEnumerableIterator'2.MoveNext()
   at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable'1 source)
   at Ninject.Planning.Targets.Target'1.GetValue(Type service, IContext parent)
   at Ninject.Planning.Targets.Target'1.ResolveWithin(IContext parent)
   at Ninject.Activation.Providers.StandardProvider.GetValue(IContext context, ITarget target)
   at Ninject.Activation.Providers.StandardProvider.<>c__DisplayClass4.<Create>b__2(ITarget target)
   at System.Linq.Enumerable.WhereSelectArrayIterator'2.MoveNext()
   at System.Linq.Buffer'1..ctor(IEnumerable'1 source)
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable'1 source)
   at Ninject.Activation.Providers.StandardProvider.Create(IContext context)
   at Ninject.Activation.Context.ResolveInternal(Object scope)
   at Ninject.Activation.Context.Resolve()
   at Ninject.KernelBase.<>c__DisplayClass15.<Resolve>b__f(IBinding binding)
   at System.Linq.Enumerable.WhereSelectEnumerableIterator'2.MoveNext()
   at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable'1 source)
   at Ninject.Planning.Targets.Target'1.GetValue(Type service, IContext parent)
   at Ninject.Planning.Targets.Target'1.ResolveWithin(IContext parent)
   at Ninject.Activation.Providers.StandardProvider.GetValue(IContext context, ITarget target)
   at Ninject.Activation.Providers.StandardProvider.<>c__DisplayClass4.<Create>b__2(ITarget target)
   at System.Linq.Enumerable.WhereSelectArrayIterator'2.MoveNext()
   at System.Linq.Buffer'1..ctor(IEnumerable'1 source)
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable'1 source)
   at Ninject.Activation.Providers.StandardProvider.Create(IContext context)
   at Ninject.Activation.Context.ResolveInternal(Object scope)
   at Ninject.Activation.Context.Resolve()
   at Ninject.KernelBase.<>c__DisplayClass15.<Resolve>b__f(IBinding binding)
   at System.Linq.Enumerable.WhereSelectEnumerableIterator'2.MoveNext()
   at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable'1 source)
   at Ninject.Web.WebApi.NinjectDependencyScope.GetService(Type serviceType)
   at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func'1& activator)
   at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
   --- End of inner exception stack trace ---
   at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
   at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)
   at System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncCore(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter'1.GetResult()
   at System.Web.Http.HttpServer.<SendAsync>d__0.MoveNext()

Вот контроллер, который пытается создать экземпляр:

public class AccountsController : ApiControllerBase
{
    private IAuthenticationService _auth;
    private IConfigurationManager _config;
    private static readonly ILog LOG = LogManager.GetLogger(typeof(AccountsController));

    public AccountsController(IAuthorizationService authService, IAuthenticationService auth, IConfigurationManager config)
        : base(authService)
    {
        _auth = auth;
        _config = config;
    }

И вот мой файл Startup.cs:

public class Startup {public static IKernel Kernel {get; private set; частный набор; } }

    static Startup()
    {
        Kernel = new StandardKernel();
        RegisterServices(Kernel);
    }
    public void Configuration(IAppBuilder app)
    {
        // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=316888



        var webApiConfig = ConfigureWebApi(Kernel);

        app.UseWebApi(webApiConfig);
    }

    public static HttpConfiguration ConfigureWebApi(IKernel kernel)
    {
        var config = new HttpConfiguration();
        config.DependencyResolver = new Ninject.Web.WebApi.NinjectDependencyResolver(kernel);

        //Formatting
        config.Formatters.Remove(config.Formatters.XmlFormatter);
        config.Formatters.Remove(config.Formatters.JsonFormatter);
        config.Formatters.Add(new JsonMediaTypeFormatter()
        {
            SerializerSettings = JsonSettings.SETTINGS,
            Indent = true,
        });

        //Error handling
        config.Services.Add(typeof(IExceptionLogger), new Log4NetExceptionLogger());
        config.Services.Replace(typeof(IExceptionHandler), new EntityErrorExceptionHandler());

        //Routing
        config.MapHttpAttributeRoutes();
        config.EnsureInitialized();
        return config;
    }


    private static void RegisterServices(IKernel kernel)
    {
        kernel.Load<ConfigurationModule>();
        kernel.Load<ResourceModule>();
        kernel.Load<SecurityModule>();

        kernel.Bind<IEmailService>().To<Email.SendGridService>();


    }
}

Эти модули содержат все необходимые зависимости. Я подтвердил, что все они связаны правильно. Кто-нибудь знает, почему я все еще получаю эту ошибку? Есть ли что-то, что можно сделать, чтобы исправить это?

Теги:
asp.net-web-api
asp.net-web-api2
ninject

1 ответ

4
Лучший ответ

Я нашел решение. С моей стороны это была просто голова. Мои привязки зависимостей не были настроены правильно. Если бы мне было предоставлено более полезное исключение...

  • 6
    У меня была похожая проблема, моя неправильная конфигурация Ninject была Bind <IAdministrationController, AdministrationController> (); , Предполагалось, что это будет Bind <IAdministrationController> (). To <AdministrationController> ();
  • 0
    Спасибо, это тоже была моя проблема ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню