0

My global.asax looks like below

private void BuildIocContainer()
    {
        var builder = new ContainerBuilder();
        builder.RegisterModule(new BootstrapModule());
        var container = builder.Build();
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
        GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container); //Set the WebApi DependencyResolver
    }

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

I have built a bootstrap module for autofac like the one below

public class BootstrapModule : Autofac.Module
{
    private Assembly AssemblyOf<T>()
    {
        return typeof(T).Assembly;
    }

    private Assembly WebAssembly
    {
        get { return Assembly.GetExecutingAssembly(); }
    }

    private void RegisterMvc(ContainerBuilder builder)
    {
        builder.RegisterType<AsyncControllerActionInvoker>()
            .As<IActionInvoker>();

        builder.RegisterControllers(WebAssembly)
            .InjectActionInvoker();
        builder.RegisterApiControllers(WebAssembly).InjectActionInvoker();
    }

    private void RegisterLogger(ContainerBuilder builder)
    {
        builder.Register(CreateLogger)
            .SingleInstance();
        builder.Register(_ => new NLogWrapper(LogManager.GetLogger("DefaultLogger")))
            .As<Logging.ILogger>()
            .SingleInstance();
    }

    private static System.Func<Type, Logging.ILogger> CreateLogger(IComponentContext componentContext)
    {
        return type => new NLogWrapper(LogManager.GetLogger(type.FullName));
    }

    protected override void Load(ContainerBuilder builder)
    {
        RegisterLogger(builder);
        RegisterMvc(builder);
        builder.RegisterAssemblyTypes(WebAssembly)
                .AsImplementedInterfaces();

        builder.RegisterType<UserService>()
        .As<IUserService>()
        .InstancePerRequest();            
        builder.RegisterAssemblyTypes(typeof(IUserService).Assembly)
               .AsImplementedInterfaces();
        builder.RegisterAssemblyTypes(typeof(IUserRepository).Assembly)
                .AsImplementedInterfaces();
        builder.RegisterFilterProvider();
    }
}

Now, when I try to hit account controller through postman client,

private IUserService _userService;

    public AccountController(IUserService userService)
    {
        _userService = userService;
    }



    // POST api/Account/Register
    [AllowAnonymous]
    [Route("Register")]
    public HttpStatusCode Register(User model)
    {
        if (!ModelState.IsValid)
        {
            return HttpStatusCode.BadRequest;
        }

        // TODO : Write mapper if needed
        var user = new ToolUser()
        {
            FirstName = model.FirstName,
            LastName = model.LastName,
            EmailID = model.EmailID,
            DOB = Convert.ToDateTime(model.DateOfBirth),
            Gender = model.Gender.ToString(),
            TenandID = model.TenantID,
            Password = model.Password
        };

        HttpStatusCode result = _userService.RegisterUser(user);

        return result;
    }

I get the error

"An error occurred when trying to create a controller of type 'AccountController'. Make sure that the controller has a parameterless public constructor."

What am I doing wrong?

Cœur
  • 37,241
  • 25
  • 195
  • 267
Ponnapally
  • 88
  • 1
  • 13
  • Possible duplicate of [Make sure that the controller has a parameterless public constructor error](http://stackoverflow.com/questions/24254189/make-sure-that-the-controller-has-a-parameterless-public-constructor-error) – Divyang Desai Dec 22 '16 at 10:09
  • Hi @Div. I do not have any DBContexts or other dependencies on the resolving interface. But I have OWIN with a startup class as well as global.asax in my WebAPI. I am doing the resolution in global.asax for now – Ponnapally Dec 22 '16 at 11:12

1 Answers1

3

You should have something like HttpConfiguration config = new HttpConfiguration(); somewhere, which you use to register your routes etc.

Pass that config to your BuildIocContainer() mehod and add the line

config.DependencyResolver = new AutofacWebApiDependencyResolver(container);

instead of

GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container); //Set the WebApi DependencyResolver

Hope that helps

Alex Ciocan
  • 2,272
  • 14
  • 20
jps
  • 20,041
  • 15
  • 75
  • 79