Autofac с MVC4: у контроллера нет конструктора по умолчанию - программирование
Подтвердить что ты не робот

Autofac с MVC4: у контроллера нет конструктора по умолчанию

Я работаю с Autofac в MVC3 и люблю его. Теперь я пытаюсь реализовать его с помощью MVC4.

Я установил предварительные версии Autofac MVC4 и Autofac WebApi через консоль диспетчера пакетов (Install-Package Autofac.Mvc4 -Pre и Install-Package Autofac.WebApi -Pre)

Я скорректировал контейнер IoC следующим образом:

    private static void SetAutofacContainer()
    {
        var builder = new ContainerBuilder();

        builder.RegisterControllers(Assembly.GetExecutingAssembly());
        builder.RegisterApiControllers(Assembly.GetExecutingAssembly());

        builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerHttpRequest().InstancePerApiRequest();
        builder.RegisterType<DatabaseFactory>().As<IDatabaseFactory>().InstancePerHttpRequest().InstancePerApiRequest();
        builder.RegisterType<RepositoryWrapper>().As<RepositoryWrapper>().InstancePerHttpRequest().InstancePerApiRequest();
        builder.RegisterType<ServiceWrapper>().As<ServiceWrapper>().InstancePerHttpRequest().InstancePerApiRequest();

        // Repositories
        builder.RegisterAssemblyTypes(typeof(UserRepository).Assembly).Where(t => t.Name.EndsWith("Repository")).AsImplementedInterfaces().InstancePerHttpRequest().InstancePerApiRequest();

        // Services
        builder.RegisterAssemblyTypes(typeof(UserService).Assembly).Where(t => t.Name.EndsWith("Service")).AsImplementedInterfaces().InstancePerHttpRequest().InstancePerApiRequest();

        IContainer container = builder.Build();
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
        GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);

    }

Когда я запускаю приложение (путем доступа к контроллеру API), я получаю исключение: " Controllers.UserController 'не имеет конструктора по умолчанию"

Контроллер выглядит следующим образом:

namespace Controllers
{
[Authorize]
public class UserController : ApiController
{
    private ServiceWrapper _services;

    public UserController(ServiceWrapper services)
    {
        _services = services;
    }

    // GET api/user/{userrequest}
    public IQueryable<User> Get(UserRequest request)
    {
        if (ModelState.IsValid)
        {
          '...
        }  
    } 
}

Я что-то упустил? Разве я не настроил это правильно? Любая помощь будет принята с благодарностью!

Обновление

Мой контроллер API находится в рамках отдельного проекта в том же решении. Если я положу контроллер API в свой основной проект MVC, он будет работать. Может ли кто-нибудь рассказать мне, как заставить Autofac регистрировать контроллеры API в моем проекте API?

4b9b3361

Ответ 1

С помощью метода RegisterApiControllers вы указываете Autofac, где (в какой сборке) он должен искать ваш ApiControllers

Итак, следующий вызов:

builder.RegisterApiControllers(Assembly.GetExecutingAssembly());

Регистрирует ApiControllers из текущей сборки (проекта).

Если у вас есть ApiController и в другом проекте, вам нужно использовать его следующим образом:

builder.RegisterApiControllers(typeof(UserController).Assembly);

Это означает: зарегистрируйте все ApiController форму сборки (проекта), в которой живет UserController. Поэтому вам нужна только одна RegisterApiControllers на сборку, даже если в сборке (проекте) есть несколько ApiController.