0

Вот мое сообщение об ошибке, которое отображается, когда я просматриваю: ../api/User«RavenReader.Web.Controllers.UserController» не имеет конструктор по умолчанию

<Error> 
<Message>An error has occurred.</Message> 
<ExceptionMessage> 
Type 'RavenReader.Web.Controllers.UserController' does not have a default constructor 
</ExceptionMessage> 
<ExceptionType>System.ArgumentException</ExceptionType> 
<StackTrace> 
at System.Linq.Expressions.Expression.New(Type type) at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType) 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) 
</StackTrace> 
</Error> 

Мой контроллер Классы

public class BaseController : ApiController 
    { 
     private readonly ICookieStorageService _cookieStorageService; 

     public BaseController(ICookieStorageService cookieStorageService) 
     { 
      _cookieStorageService = cookieStorageService; 
     } 
    } 

public class UserController : BaseController 
    { 
     private readonly RavenUserFacade _facade; 
     private readonly ICookieStorageService _cookieStorageService;  
     public UserController(ICookieStorageService cookieStorageService, RavenUserFacade facade):base(cookieStorageService) 
     { 
      _facade = facade; 
     } 

     // GET api/User 
     public IEnumerable<RavenUserView> Get() 
     { 
      var users = _facade.GetAllUser(); 
      return users.RavenUsers; 
     } 
     .......................................... 
     .......................................... 
    } 

по http://www.peterprovost.org/blog/2012/06/19/adding-ninject-to-web-api/ этот блог я организовал мой NinjectDependencyScope класс, NinjectDependencyResolver класс и NinjectWebCommon следующим образом:

public class NinjectDependencyScope : IDependencyScope 
    { 
     private IResolutionRoot resolver; 

     internal NinjectDependencyScope(IResolutionRoot resolver) 
     { 
      Contract.Assert(resolver != null); 

      this.resolver = resolver; 
     } 

     public void Dispose() 
     { 
      var disposable = resolver as IDisposable; 
      if (disposable != null) 
       disposable.Dispose(); 

      resolver = null; 
     } 

     public object GetService(Type serviceType) 
     { 
      if (resolver == null) 
       throw new ObjectDisposedException("this", "This scope has already been disposed"); 

      return resolver.TryGet(serviceType); 
     } 

     public IEnumerable<object> GetServices(Type serviceType) 
     { 
      if (resolver == null) 
       throw new ObjectDisposedException("this", "This scope has already been disposed"); 

      return resolver.GetAll(serviceType); 
     } 
    } 
public class NinjectDependencyResolver : NinjectDependencyScope, IDependencyResolver 
    { 
     private IKernel kernel; 

     public NinjectDependencyResolver(IKernel kernel) 
      : base(kernel) 
     { 
      this.kernel = kernel; 
     } 

     public IDependencyScope BeginScope() 
     { 
      return new NinjectDependencyScope(kernel.BeginBlock()); 
     } 
    } 


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> 
     public static IKernel CreateKernel() 
     { 
      var kernel = new StandardKernel(); 
      kernel.Bind<Func<IKernel>>().ToMethod(ctx =>() => new Bootstrapper().Kernel); 
      kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); 

      RegisterServices(kernel); 
      GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(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<IDbFactory>().To<IDbFactory>().InSingletonScope(); 
      kernel.Bind<IUnitOfWork>().To<EFUnitOfWork>(); 
      kernel.Bind<IRavenUserRepository>().To<RavenUserRepository>(); 
      kernel.Bind<IRavenUserFacade>().To<RavenUserFacade>(); 
      kernel.Bind<ICookieStorageService>().To<CookieStorageService>(); 
      kernel.Bind<ICacheStorage>().To<HttpContextCacheAdapter>(); 
     } 
    } 

Я использую Visual Studio 2013 Ninject Для MVC-3

+0

ли Вы, помните, установка этого ' DependencyResolver' для вашего 'WebApiConfig'? Обычно это делается в 'WebApiConfig.cs' – cvbarros

+0

Спасибо за ваш ответ. Я сделал тест Apicontroller в моем же проекте, где он работает нормально. Код контроллера является открытым классом TestController: ApiController { private readonly ITest _test; public TestController (тест ITest) { _test = test; } public string Get() { return_test.Имя; } } и внутри NinjectWebCommon.cs Я связываю следующее: kernel.Bind () .To () ;. но когда я работаю с моим реальным контроллером, он возвращает мне ошибку метода конструктора по умолчанию. –

ответ

0

Спасибо за ваш ответ. Я следил за каждым твоим шагом, но с теми же результатами. Наконец, я отлаживался привязками, которые находятся внутри NinjectWebCommon.cs, и я нашел здесь проблему. При отладке он показывает мне следующую задачу: Расположение источника для Bootstrapper.cs не найдено Вам нужно найти Bootstrapper.cs для просмотра исходного кода в кадре стека текущего вызова

'c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\Bootstrapper.cs'. Checksum: MD5 {13 3e b1 f3 ba a7 65 14 f6 dc 4d f1 dd aa 21 bf} 
The file 'c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\Bootstrapper.cs' does not exist. 
Looking in script documents for 'c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\Bootstrapper.cs'... 
Looking in the projects for 'c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\Bootstrapper.cs'. 
The file was not found in a project. 
Looking in directory 'C:\Program Files\Microsoft Visual Studio 11.0\VC\crt\src\'... 
Looking in directory 'C:\Program Files\Microsoft Visual Studio 11.0\VC\crt\src\vccorlib\'... 
Looking in directory 'C:\Program Files\Microsoft Visual Studio 11.0\VC\atlmfc\src\mfc\'... 
Looking in directory 'C:\Program Files\Microsoft Visual Studio 11.0\VC\atlmfc\src\atl\'... 
Looking in directory 'C:\Program Files\Microsoft Visual Studio 11.0\VC\atlmfc\include'... 
The debug source files settings for the active solution indicate that the debugger will not ask the user to find the file: c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\Bootstrapper.cs. 
The debugger could not locate the source file 'c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\Bootstrapper.cs'. 
0

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

Прежде всего, вы должны использовать другую реализацию для NinjectDependencyResolver. Я установил this gist. Причина этого заключается в том, чтобы избежать проблем с областями (особенно синглетонами), которые вы можете узнать больше о here.

Обратно к вашей проблеме, ошибка в ваших привязках, где-то. Сначала попробуйте удалить InSingletonScope со своего IDbFactory. Затем попробуйте удалить один из зависимостей от вашего контроллера-контроллера и проверить, работает ли это. Наконец, разделите базовый класс и посмотрите, работает ли он.

Эти шаги предназначены только для того, чтобы вы отслеживали проблему. Я воспроизвел ваш сценарий здесь, и я не мог столкнуться с той же проблемой. Моя установка была такая:

public class BaseController : ApiController 
{ 
    protected readonly IService _service; 
    public BaseController(IService service) 
    { 
     _service = service; 
    } 
} 

public class ValuesController : BaseController 
{ 
    public ISomeOtherDependency Dependency { get; set; } 

    public ValuesController(IService service, ISomeOtherDependency dependency) : base(service) 
    { 
     Dependency = dependency; 
    } 

    // GET api/values/5 
    public string Get(int id) 
    { 
     return _service.CreatedAt.ToString("u"); 
    } 
} 

public interface ISomeOtherDependency 
{ 

} 

public class ConcreteDependency : ISomeOtherDependency 
{ 
} 

public interface IService 
{ 
    DateTime CreatedAt { get; } 
} 

public class Service : IService 
{ 
    public Service() 
    { 
     CreatedAt = DateTime.Now; 
    } 

    public DateTime CreatedAt { get; private set; } 
} 

И мои привязки:

kernel.Bind<IService>().To<Service>(); // If I comment this, I get the same exception. 
kernel.Bind<ISomeOtherDependency>().To<ConcreteDependency>(); 

Но, комментируя один из этих привязок, я получаю ту же самую ошибку, как вы:

ValuesController' does not have a default constructor 

I надеюсь, что это поможет вам решить проблему.

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