autofac mvc3 с конструктором контроллера по умолчанию, нужна помощь? - PullRequest
1 голос
/ 21 ноября 2011

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

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

Mock<iproductrepository> mock = new Mock<iproductrepository>();
mock.Setup(m => m.products).Returns(new List<product>()
                                        {
                                            new product() {name = "football", price = 25},
                                            new product() {name = "surf board",price = 179},
                                            new product() {name = "running shoes", price = 95}
                                        }.AsQueryable()

    );

builder.RegisterInstance(mock.Object).As<iproductrepository>();
builder.RegisterModelBinders(Assembly.GetExecutingAssembly());
builder.RegisterControllers(Assembly.GetExecutingAssembly());


var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

а вот контроллер простой

public class productcontroller : Controller
{
    private readonly iproductrepository _productrepository;


    /// <summary>
    /// 
    /// </summary>
    /// <param name="productrepository"></param>
    public productcontroller(iproductrepository productrepository)
    {
        _productrepository = productrepository;
    }

    //
    // GET: /product.controller/

    public ViewResult list()
    {
        return View(_productrepository.products);
    }

}

получаю эту ошибку

Для этого объекта не определен конструктор без параметров. Описание: Ан необработанное исключение произошло во время выполнения текущей сети запрос. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации о ошибка и откуда она возникла в коде. Детали исключения: System.MissingMethodException: конструктор без параметров не определен для этого объекта. Ошибка источника: сгенерировано необработанное исключение во время выполнения текущего веб-запроса. Информация относительно происхождение и местонахождение исключения можно определить с помощью трассировка стека исключений ниже. Трассировка стека: [MissingMethodException: Нет Для этого объекта определен беспараметрический конструктор.]
System.RuntimeTypeHandle.CreateInstance (тип RuntimeType, логическое значение 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 (тип, логическое значение непубличный) + 69
System.Web.Mvc.DefaultControllerActivator.Create (RequestContext requestContext, Type controllerType) +67 [InvalidOperationException: Произошла ошибка при попытке создать контроллер типа '* .Productcontroller'. Убедитесь, что контроллер имеет

1 Ответ

5 голосов
/ 21 ноября 2011

Autofac в методе builder.RegisterControllers регистрирует контроллеры, имена которых заканчиваются на «Controller» с большой буквы C:

...
if (typeof (IController).IsAssignableFrom(t))
   return t.Name.EndsWith("Controller");
else
   return false;
...

Таким образом, вам нужно переименовать ваш контроллер в productController (в любом случае в C # ProductController в соответствии с соглашениями об именах ) или зарегистрировать ваши контроллеры вручную в контейнере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...