Не определен объект конструктора без параметров - PullRequest
3 голосов
/ 29 марта 2012

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

 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

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

 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>();
    }
          }
            }

Ответы [ 3 ]

4 голосов
/ 29 марта 2012

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

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

Однако рекомендуется подключить Ninject с помощью , добавив ссылку NuGet на Ninject.MVC3 .Об этом есть в Ninject MVC3 wiki .

.
3 голосов
/ 29 марта 2012

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

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

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

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

Основной шаблон DI - Constructor Injection. При активации экземпляра типа Ninject выберет один из конструкторов типа для использования, применяя следующие правила по порядку: -

  • Если конструктор имеет атрибут [Inject], он используется (но если вы примените атрибут более чем к одному, Ninject выдаст исключение NotSupportedException во время выполнения при обнаружении).
  • Если ни один из конструкторов не имеет атрибута [Inject], Ninject выберет тот, с большинством параметров, которые Ninject понимает, как разрешить.
  • Если конструкторы не определены, Ninject выберет конструктор по умолчанию без параметров (при условии, что он есть).

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

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

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

Это связывает ваш код с конкретным контейнером. (Хотя Ninject разрешает искать настройку определенного атрибута, суть остается неизменной - вы загрязняете интерфейс внешними проблемами.)

Ваша настоящая проблема, вероятно, связана с отсутствующей ссылкой на Ninject.MVC3

2 голосов
/ 29 марта 2012

Хотя 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?

...