Подтвердить что ты не робот

Как разрешить контроллеры веб-API с помощью Autofac в смешанном веб-API и приложении MVC?

Привет У меня есть приложение MVC, где я определил некоторые зависимости к моему веб-API.

public class AutofacWebApiDependenceResolver : IDependencyResolver
{
    private readonly IComponentContext container;
    public AutofacWebApiDependenceResolver(IContainer container)
    {

     if (container == null)
     {
         throw new ArgumentNullException("container");
     }
     this.container = container;
    }

    public object GetService(Type serviceType)
    {
        if (serviceType == null)
        {
            throw new ArgumentNullException("serviceType");
        }
        var ret = this.container.ResolveOptional(serviceType) ;
        return ret;
    }
    public IEnumerable<object> GetServices(Type serviceType)
    {            
        if (serviceType == null)
        {
            throw new ArgumentNullException("serviceType");
        }            
        Type enumerableType = typeof(IEnumerable<>).MakeGenericType(serviceType);
        var ret = (IEnumerable<object>)this.container.ResolveOptional(enumerableType);
        return ret;
    }
}

Затем в моем классе bootstrapper я вызываю его в Application_Start следующим образом:

GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependenceResolver((IContainer)container);

Когда я отлаживаю код, я вижу, что есть регистрация всех сервисов с моим DependencyResolver, но я все еще получаю следующую ошибку:

Произошла ошибка. Тип 'WebApp.Controllers.AuthenticateController' не имеет конструктора по умолчанию

Вот код для моего контроллера:

public class AuthenticateController : ApiController
{
    private readonly IFormsAuthenticationService formsAuthenticationService;
    private readonly IMemberShipProvider memberShip;
    private readonly IDataService dataService;

    public AuthenticateController(
        IMemberShipProvider memberShip,
        IFormsAuthenticationService formsAuthenticationService, IDataService dataService)
    {
        this.memberShip = memberShip;
        this.formsAuthenticationService = formsAuthenticationService;
        this.dataService= dataService;
     }

}

Как я могу доставить параметры для контроллеров api. Простые контроллеры работают нормально.

4b9b3361

Ответ 1

Руководство nemesv сделало трюк

builder.RegisterApiControllers(Assembly.GetExecutingAssembly())

Вызов builder.RegisterApiControllers перед вызовом builder.Build()

Ответ 2

Я бы предложил следующее сделать эту работу в вашем приложении как с MVC, так и с WebApi.

Сначала ваш проект должен будет иметь ссылки на следующие

  • Autofac
  • Autofac.WebApi
  • Autofac.Mvc5 (измените номер в конце, чтобы он соответствовал вашей версии aspnet mvc)

Затем в вашей регистрации Autofac вам потребуется следующее, которое будет регистрировать контроллеры MVC и WebApi и любые другие требуемые регистрации. Затем присоедините Контейнер как к MVC DI, так и к WebApi DI.

var builder= new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly()); //Register MVC Controllers
builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); //Register WebApi Controllers
//Register any other components required by your code....

var container = builder.Build();

DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); //Set the MVC DependencyResolver
GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver((IContainer)container); //Set the WebApi DependencyResolver

Надеюсь, это поможет.