Reputation: 2616
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
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
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:
RegisterApiControllers
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