AutoFac with WebApi, Still looking for parameter less constructor

I have following class in my WebApi project and RegisterContainer() method gets called from Global.ASAX class. I am injecting Service in my api controller. The issue is it;s throwing exception and not getting instantiated corrected. It says No paremeterless Controller found. Any idea what's wrong with my code

public class IocConfig
{
    #region Public Methods and Operators

    /// <summary>
    ///     Adds dependencies into the container
    /// </summary>
    /// <returns></returns>
    public static void RegisterContainer()
    {
        var builder = new ContainerBuilder();

        builder.RegisterControllers(Assembly.GetExecutingAssembly());
        builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
        IContainer container = builder.Build();
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
        GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);
        RegisterModules(builder);
        RegisterControllers(builder);
    }

    #endregion

    #region Methods

    private static void RegisterControllers(ContainerBuilder builder)
    {
        builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
    }

    private static void RegisterDependencyResolver(IContainer container, ContainerBuilder builder)
    {
        IDependencyResolver resolver = new AutofacWebApiDependencyResolver(container);

        DependencyResolver.SetResolver(resolver);
    }

    private static void RegisterModules(ContainerBuilder builder)
    {

        builder.RegisterModule(new DomainModule());
        builder.RegisterModule(new RepositoryModule());
        builder.RegisterModule(new ServiceFacadeModule());
        builder.RegisterModule(new MappingModule());

    }

    #endregion
}

}

UPDATE:

I have changed that and added only following lines to Global.Asax.

protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        //IocConfig.RegisterContainer();
        //WebApiConfig.Register(GlobalConfiguration.Configuration);

        var builder = new Autofac.ContainerBuilder();
        builder.RegisterControllers(typeof(WebApiApplication).Assembly).PropertiesAutowired();
        builder.RegisterModule(new RepositoryModule());
        builder.RegisterModule(new ServiceFacadeModule());
        builder.RegisterModule(new RepositoryModule());
        builder.RegisterModule(new MappingModule());
        builder.RegisterModule(new DomainModule());
        var container = builder.Build();
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));


    }

Upvotes: 2

Views: 734

Answers (2)

Alexey Zimarev
Alexey Zimarev

Reputation: 19640

You seems to be registering for MVC.

According to Autofac WebAPI integration documentation, you have to do this in your startup:

builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
var container = builder.Build();

var config = GlobalConfiguration.Configuration;
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);

Remember that you need a WebAPI integration package installed:

Install-Package Autofac.WebApi

Upvotes: 1

nemesv
nemesv

Reputation: 139798

You are trying to register your modules after the container has built.

You need to move the call

RegisterModules(builder);

before you create the container with builder.Build():

RegisterModules(builder);
IContainer container = builder.Build();

In your updated code you are missing two things now:

  • registering your Api controllers with RegisterApiControllers
  • setting the AutofacWebApiDependencyResolver

So your code should look like:

var builder = new Autofac.ContainerBuilder();
builder.RegisterControllers(typeof(WebApiApplication).Assembly).PropertiesAutowired();
builder.RegisterApiControllers(typeof(WebApiApplication).Assembly).PropertiesAutowired();
builder.RegisterModule(new RepositoryModule());
builder.RegisterModule(new ServiceFacadeModule());
builder.RegisterModule(new RepositoryModule());
builder.RegisterModule(new MappingModule());
builder.RegisterModule(new DomainModule());
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);

Upvotes: 3

Related Questions