8

Я пишу веб-api, используя инъекцию зависимостей, блок работы с помощью репозиториев и Autofac в качестве контейнера. Dependency получал инъекции отлично 24 часов назад, но вдруг, когда я начал работать сегодня я продолжал получать ошибкуWebApi DI Autofac - Убедитесь, что контроллер имеет безкоммертный публичный конструктор

«Сообщение»: «Произошла ошибка», «ExceptionMessage»: «Ошибка Произошла ошибка при попытке создать контроллер типа «SearchController» Убедитесь, что контроллер имеет без параметров открытого конструктора ",„ExceptionType..“: „System.InvalidOperationException“,

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

На моем веб-контроллера апи, у меня есть

private IUnitOfWork<Listing> _unitOfWork = null; 
public SearchController(IUnitOfWork<Listing> unitOfWork) 
{ 
    _unitOfWork = unitOfWork; 
} 

Единица работы принимает параметр универсального типа для создания хранилища.

В моем WebApiConfig.cs, я регистрация типов, как показано ниже

builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>)); 
builder.RegisterGeneric(typeof(UnitOfWork<>)).As(typeof(IUnitOfWork<>)).InstancePerDependency(); 
builder.RegisterType(typeof(SearchController)).UsingConstructor(typeof(IUnitOfWork<Listing>)); 

Я регистрация SearchController использовать конструктор, который принимает в IUnitOfWork <>. Все это хорошо работало, прежде чем я добавил модульные тесты Mocked, но для некоторых целей я продолжаю получать эту ошибку. Я также зарегистрировал DependencyResolver

var container = builder.Build(); 
var resolver = new AutofacWebApiDependencyResolver(container); 
config.DependencyResolver = resolver; 

ответ

6

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

1) Это, как я зарегистрировал свой общий repsoitory и единицы работы

builder.RegisterType(typeof(YourContextInRepository)); 
builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>)); 
builder.RegisterGeneric(typeof(UnitOfWork<>)).As(typeof(IUnitOfWork<>)); 

2) Это, как я могу настроить распознаватель зависимость для моего WebAPI

// Set the dependency resolver for Web API. 
var webApiResolver = new AutofacWebApiDependencyResolver(container); 
GlobalConfiguration.Configuration.DependencyResolver = webApiResolver; 

3) Для того, чтобы зарегистрировать его для контроллеров MVC,

// Set MVC DI resolver to use our Autofac container 
DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 

Этот подход работает как с MVC, так и с контроллерами WebAPI, и я могу упростить y do

private IUnitOfWork<Listing> _uow; 
public SearchController(IUnitOfWork<Listing> uow) 
{ 
    _uow = uow; 
} 

Надеюсь, что это поможет кому-то в будущем.

+1

Али, я попробовал ваш пример, и я получаю ту же ошибку «общественного конструктора без параметров» для WebAPI. Это то же сообщение, если я использовал код MVC AutoFac. У меня это есть в приложениях MVC, но в убытке от этого. Есть ли другие направления, которыми вы можете поделиться? –

1

Я столкнулся с той же проблемой, и проблема заключалась в том, что я использовал образцы кода Autofac для объекта ContainerBuilder() для MVC-контроллеров, а не API.

Here is хороший пример, как настроить его с ApiController

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

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