3

Я знаю, что это дублированный вопрос, но я не могу найти ответ на мою ошибку. Я пытаюсь показать список моих номеров, сохраненных в базе данных, но я получаю следующее сообщение об ошибке:Определенный объект конструктора без параметров:

Server Error in '/' Application. 
    No parameterless constructor defined for this object. 
    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

     Exception Details: System.MissingMethodException: No parameterless constructor defined for this object. 

    Source Error: 

    An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below. 

    Stack Trace: 

    [MissingMethodException: No parameterless constructor defined for this object.] 
    System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0 
    System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache) +98 
    System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache) +241 
    System.Activator.CreateInstance(Type type, Boolean nonPublic) +69 
    System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +67 

    [InvalidOperationException: An error occurred when trying to create a controller of type 'HotelProjectFinal.Controllers.RoomController'. Make sure that the controller has a parameterless public constructor.] 
    System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +182 
    System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) +80 
    System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) +74 
    System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory) +232 
    System.Web.Mvc.<>c__DisplayClass6.<BeginProcessRequest>b__2() +49 
    System.Web.Mvc.<>c__DisplayClassb`1.<ProcessInApplicationTrust>b__a() +13 
    System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f) +7 
    System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) +22 
    System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Func`1 func) +124 
    System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +98 
    System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +50 
    System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +16 
    System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8969412 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184 

Но у меня есть конструктор withou параметра:

namespace HotelProjectFinal.Controllers 
{ 
    public class RoomController : Controller 
    { 
     private IRoomRepository repository; 

     public RoomController(IRoomRepository roomRepository) 
     { 
      repository = roomRepository; 
     } 

     public ViewResult List() 
     { 
      return View(repository.Rooms); 
     } 
    } 
} 

Моя точка зрения:

@model IEnumerable<HotelProjectFinal.Models.Room> 

    @{ 
    ViewBag.Title = "List"; 
    } 

    @foreach (var p in Model) 
    { 
     <div class="item"> 
     <h3>@p.Room_number</h3> 
     @p.Room_Type 
     <h4>@p.Room_Type.Price.ToString("c")</h4> 
     </div> 
     } 

Я использую Ninject:

   public class NinjectControllerFactory : DefaultControllerFactory 
      { 
    private IKernel ninjectKernel; 
    public NinjectControllerFactory() 
    { 
     ninjectKernel = new StandardKernel(); 
     AddBindings(); 
    } 
    protected override IController GetControllerInstance(RequestContext requestContext, 
    Type controllerType) 
    { 
     return controllerType == null 
     ? null 
     : (IController)ninjectKernel.Get(controllerType); 
    } 
    private void AddBindings() 
    { 
     ninjectKernel.Bind<IRoomRepository>().To<EFRoomRepository>(); 
    } 
      } 
      } 
+1

Вы используете контейнер IoC? как вводится «IRoomRepository»? –

+5

В вашем примере контроллера я вижу только один конструктор, который принимает 1 параметр. –

+0

Вы говорите, что у вас есть конструктор без параметра .... где он? Кажется, ваш единственный конструктор принимает IRoomRepository. –

ответ

4

У вас есть фабрика контроллеров, но тот факт, что stacktrace ничего не говорит о Ninject, предполагает, что вы забыли сообщить MVC об этом.

Вы можете исправить это, добавив строку, чтобы сказать это.

Однако рекомендуемая практика заключается в том, чтобы подключить Ninject в adding a NuGet reference to Ninject.MVC3. Есть документы об этом на связанных Ninject MVC3 wiki.

3

Пожалуйста, попробуйте изменить конструкторы следующего:

public RoomController() { } // You were missing this parameterless constructor 

[Inject] 
public RoomController(IRoomRepository roomRepository) 
{ 
    repository = roomRepository; 
} 

Ninject ищет конструктор без параметров, потому что вы не указали [Inject] выше конструктора, который вы хотите использовать для инъекции зависимостей. Это смутило «Ninject» и вызвало исключение исключения.

The primary DI pattern is Constructor Injection. When activating an instance of a type Ninject will choose one of the type’s constructors to use by applying the following rules in order:-

  • If a constructor has an [Inject] attribute, it is used (but if you apply the attribute to more than one, Ninject will throw a NotSupportedException at runtime upon detection).
  • If no constructors have an [Inject] attribute, Ninject will select the one with the most parameters that Ninject understands how to resolve.
  • If no constructors are defined, Ninject will select the default parameterless constructor (assuming there is one).

Более подробную информацию можно найти здесь:

https://github.com/ninject/ninject/wiki/Injection-Patterns

Как отметил Рубен, [Inject] атрибут загрязняет контроллера с внешними проблемами.

This ties your code to a specific container. (Although Ninject does permits the customization of the specific attribute to look for, the point remains – you’re polluting an interface with external concerns.)

Действительная проблема, вероятно, полагается в отсутствующей ссылкой на Ninject.MVC3

+1

Беспараметрический конструктор не имеет никакой цели и только добавляет путаницу здесь. Если вики не дают достаточно ясного представления, возможно, это должно быть выделено жирным шрифтом и курсивом - установка атрибутов '[Inject]' не является хорошей общей идеей - она ​​привязывает вас к контейнеру без каких-либо причин и ничего не выполняет. Можете ли вы изменить свой совет, чтобы удалить предложение обоим, пожалуйста. –

+0

Спасибо, что указали это, я обновил сообщение. –

+0

Прохладный, спасибо .... –

2

Даже если IRoomRepository может быть пустым, что не делает его конструктор без параметров. С первого взгляда похоже, что ваш IoC неправильно подключен к IRoomRepository. Без IoC или неправильно сконфигурированного IoC активатор контроллера ищет конструктор без параметров для ваших контроллеров.

// This is a parameterless constructor. 
public RoomController() 
{ } 

// This is not a parameterless constructor. 
public RoomController(IRoomRepository roomRepository) 
{ 
    repository = roomRepository; 
} 

Edit, Вы используете Ninject.Mvc и базовый MvcHttpApplication реализует NinjectHttpApplication?

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