Ponnapally
Ponnapally

Reputation: 98

Dependency is not getting resolved in WebAPI (including OWIN) with Autofac

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?

Upvotes: 0

Views: 759

Answers (1)

jps
jps

Reputation: 22525

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

Upvotes: 3

Related Questions