2016-11-29 6 views
1

Я разрабатываю веб-службу ASP.NET Web Api 2.2 с .NET Framework 4.6.2.Контроллер Api не имеет предопределенного конструктора

Да, есть много вопросов, подобных моим, но и я сделал это все, что они предлагают в своих ответах и ​​у меня есть следующее сообщение об ошибке:

{ 
    "Message": "Error.", 
    "ExceptionMessage": "Error trying to create a controller of type 'PrintedCodesStatisticsController'. Ensure that the controller has a public constructor without parameters.", 
    "ExceptionType": "System.InvalidOperationException", 
    "StackTrace": " en System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)\r\n en System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)\r\n en System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()", 
    "InnerException": { 
    "Message": "Error.", 
    "ExceptionMessage": "Type 'MyProject.WebApi.Controllers.PrintedCodesStatisticsController' doesn't have a predefined constructor", 
    "ExceptionType": "System.ArgumentException", 
    "StackTrace": " en System.Linq.Expressions.Expression.New(Type type)\r\n en System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType)\r\n en System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator)\r\n en System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)" 
    } 
} 

пакеты, которые я использую в моем проекте являются:

<?xml version="1.0" encoding="utf-8"?> 
<packages> 
    <package id="EntityFramework" version="6.1.3" targetFramework="net462" /> 
    <package id="log4net" version="2.0.5" targetFramework="net462" /> 
    <package id="Microsoft.AspNet.WebApi" version="5.2.3" targetFramework="net462" /> 
    <package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net462" /> 
    <package id="Microsoft.AspNet.WebApi.Client.es" version="5.2.3" targetFramework="net462" /> 
    <package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net462" /> 
    <package id="Microsoft.AspNet.WebApi.Core.es" version="5.2.3" targetFramework="net462" /> 
    <package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.3" targetFramework="net462" /> 
    <package id="Microsoft.AspNet.WebApi.WebHost.es" version="5.2.3" targetFramework="net462" /> 
    <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net462" /> 
    <package id="Newtonsoft.Json" version="9.0.1" targetFramework="net462" /> 
    <package id="Ninject" version="3.2.2.0" targetFramework="net462" /> 
    <package id="Ninject.MVC5" version="3.2.1.0" targetFramework="net462" /> 
    <package id="Ninject.Web.Common" version="3.2.3.0" targetFramework="net462" /> 
    <package id="Ninject.Web.Common.WebHost" version="3.2.3.0" targetFramework="net462" /> 
    <package id="WebActivatorEx" version="2.2.0" targetFramework="net462" /> 
</packages> 

и я уверен, что я использую NinjectDependenciaResolver потому что я отлажена его, и он останавливается на нем устанавливается GlobalConfiguration.Configuration.DependencyResolver.

NinjectDependencyResolver является:

using Ninject; 
using System.Web.Http.Dependencies; 

namespace AnotherProject.Web.Common.Ninject 
{ 
    /// <summary> 
    /// Used to resolve dependencies. 
    /// </summary> 
    public class NinjectDependencyResolver : NinjectDependencyScope, IDependencyResolver 
    { 
     public NinjectDependencyResolver(IKernel kernel) 
      : base(kernel) 
     { } 

     public IDependencyScope BeginScope() 
     { 
      return this; 
     } 
    } 
} 

И NinjectDependencyScope является:

public class NinjectDependencyScope : IDependencyScope 
{ 
    private readonly IKernel _container; 

    public IKernel Container 
    { 
     get { return _container; } 
    } 

    public NinjectDependencyScope(IKernel container) 
    { 
     _container = container; 
    } 

    public object GetService(Type serviceType) 
    { 
     return _container.TryGet(serviceType); 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     return _container.GetAll(serviceType); 
    } 

    public void Dispose() 
    { 
     // noop 
    } 
} 

И, наконец, NinjectConfigurator является:

public class NinjectConfigurator 
{ 
    /// <summary> 
    /// Entry method used by caller to configure the given 
    /// container with all of this application's 
    /// dependencies. Also configures the container as this 
    /// application's dependency resolver. 
    /// </summary> 
    public void Configure(IKernel container) 
    { 
     // Add all bindings/dependencies 
     AddBindings(container); 

     // Use the container and our NinjectDependencyResolver as 
     // application's resolver 
     var resolver = new NinjectDependencyResolver(container); 
     GlobalConfiguration.Configuration.DependencyResolver = resolver; 
    } 

    /// <summary> 
    /// Add all bindings/dependencies to the container 
    /// </summary> 
    private void AddBindings(IKernel container) 
    { 
     [ ... ] 
    } 
} 

Как я могу решить эту ошибку?

+0

Это сообщение об ошибке типична, если где-то ваш интерфейс не унаследовал от своего класса ...Было бы хорошо, если бы вы показали код, в котором вы связываете свои кланы с интерфейсами, - может быть источником ошибки – Vladimir

+0

Каковы зависимости для PrintedCodesStatisticsController? Можете ли вы предоставить эти детали? Как выглядит конструктор для PrintedCodesStatisticsController? – Vinod

+0

Спасибо, но проблема в том, что я вводил интерфейс, который он не был определен в классе «NinjectConfigurator». – VansFannel

ответ

1

Существует несколько способов регистрации контейнера Ninject IoC. Один из способов - использовать WebActivator.

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(NinjectWebCommon), "Start")] 
[assembly: WebActivatorEx.ApplicationShutdownMethodAttribute(typeof(NinjectWebCommon), "Stop")] 

Вы можете загрузить мой пример проекта на GitHub. Оригинальный проект для MVC, поэтому вам просто нужно заменить строки 30 и 31 следующими двумя строками для веб-API.

var resolver = new NinjectDependencyResolver(container); 
GlobalConfiguration.Configuration.DependencyResolver = resolver; 

FYI: Есть два основных файла для Ninject в моем образце проекта - NinjectConfigurator.cs и NinjectWebCommon.cs.

+0

Спасибо, но проблема в том, что я вводил интерфейс, который он не был определен в классе «NinjectConfigurator». – VansFannel

+0

Я рад, что вы это поняли. – Win

0

Для того, чтобы сделать фреймворк Nendject Dependency Injection работать с ASP.NET WebApi 2.2 с .NET Framework 4.6.2, установите следующие пакеты, обратите внимание на пакеты Ninject и версии.

Ninject 3.2.0.0 
Ninject.MVC5 3.2.1.0 
Ninject.Web.Common 3.2.0.0 
Ninject.Web.WebApi 3.2.4.0 
Ninject.Web.WebApi.WebHost 3.2.4.0 

packages.config

<?xml version="1.0" encoding="utf-8"?> 
<packages> 
    <package id="EntityFramework" version="6.1.3" targetFramework="net462" /> 
    <package id="log4net" version="2.0.5" targetFramework="net462" /> 
    <package id="Microsoft.AspNet.WebApi" version="5.2.3" targetFramework="net462" /> 
    <package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net462" /> 
    <package id="Microsoft.AspNet.WebApi.Client.es" version="5.2.3" targetFramework="net462" /> 
    <package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net462" /> 
    <package id="Microsoft.AspNet.WebApi.Core.es" version="5.2.3" targetFramework="net462" /> 
    <package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.3" targetFramework="net462" /> 
    <package id="Microsoft.AspNet.WebApi.WebHost.es" version="5.2.3" targetFramework="net462" /> 
    <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net462" /> 
    <package id="Newtonsoft.Json" version="9.0.1" targetFramework="net462" /> 
    <package id="Ninject" version="3.2.0.0" targetFramework="net462" /> 
    <package id="Ninject.MVC5" version="3.2.1.0" targetFramework="net462" /> 
    <package id="Ninject.Web.Common" version="3.2.0.0" targetFramework="net462" /> 
    <package id="Ninject.Web.Common.WebHost" version="3.2.0.0" targetFramework="net462" /> 
    <package id="Ninject.Web.WebApi" version="3.2.4.0" targetFramework="net462" /> 
    <package id="Ninject.Web.WebApi.WebHost" version="3.2.4.0" targetFramework="net462" /> 
    <package id="WebActivatorEx" version="2.2.0" targetFramework="net462" /> 
</packages> 

Вот это NijectWebCommon.cs, расположенные в App_Start, пожалуйста, убедитесь, что типы вы зарегистрированы в методе RegisterServices правильно зарегистрированы например ..

kernel.Bind<IEmployeeRepository>().To<EmployeeRepository>(); instead of 
kernel.Bind<IEmployeeRepository, EmployeeRepository>(); 

NijectWebCommon.cs

using MyData; 
using System; 
using System.Web; 

using Microsoft.Web.Infrastructure.DynamicModuleHelper; 

using Ninject; 
using Ninject.Web.Common; 

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(MyTestApp.App_Start.NinjectWebCommon), "Start")] 
[assembly: WebActivatorEx.ApplicationShutdownMethodAttribute(typeof(MyTestApp.App_Start.NinjectWebCommon), "Stop")] 

namespace MyTestApp.App_Start 
{ 


    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); 
       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<IEmployeeRepository>().To<EmployeeRepository>(); 
     }   
    } 
} 

Вот контроллер образец апи

using System.Web.Http; 
using MyData; 

namespace MyTestApp.Controllers 
{ 
    public class MyTestController : ApiController 
    { 
     private readonly IEmployeeRepository _employeeRepository; 
     public MyTestController(IEmployeeRepository employeeRepository) 
     { 
      _employeeRepository = employeeRepository; 
     } 


     public IHttpActionResult Get() 
     { 
      var employees = _employeeRepository.GetEmployees(); 
      return Ok(employees); 
     } 
    } 
} 
+0

Спасибо, но проблема в том, что я вводил интерфейс, который он не был определен в классе «NinjectConfigurator». – VansFannel

 Смежные вопросы

  • Нет связанных вопросов^_^