Search code examples
c#asp.net-web-api2autofac

Autofac is not creating complex objects successfully


I am new to Autofac based dependency injection. As per our company requirements, I have to use it in the new web API I am creating. The following is my code. I am using IocConfig class for Autofac to create and inject objects in my Web API.

public class MemberCodeController : ApiController
{
    private IMemberStrategy memberStrategy;
    private IMemberDetail memberDetail;

    //Constructor dependency injection through Autofac
    public MemberCodeController(IMemberStrategy memberStrategy, 
              IMemberDetail memberDetail)
    {
        this.memberStrategy = memberStrategy;
    }

public IHttpActionResult CreateMember(string email)
    {
         memberDetail.DataFields.RegisterCode  = GetCode();
         memberDetail.Email = email;
    }
}

The MemberDetail class:

public interface IMemberDetail
{
  String Email { get; set; }
  DataFields DataFields { get; set; }
}

public class MemberDetail : IMemberDetail
{     
  public String Email { get; set; }
  public DataFields DataFields { get; set; }
}

public interface IDataFields
{
  String RegisterCode { get; set; }
}
public class DataFields : IDataFields
{
  public String RegisterCode { get; set; }
}

IocConfig:

public class IocConfig
{
    //Autofac configuration
    public static void Configure()
    {
        ContainerBuilder builder = new ContainerBuilder();
        builder.RegisterApiControllers(Assembly.GetExecutingAssembly());           
        builder.RegisterType<MemberStrategy>().As<IMemberStrategy>();
        builder.RegisterType<DataFields>().As<IDataFields>();
        builder.RegisterType<MemberDetail>().As<IMemberDetail>();
        IContainer container = builder.Build();
        AutofacWebApiDependencyResolver resolver = new 
        AutofacWebApiDependencyResolver(container);
        GlobalConfiguration.Configuration.DependencyResolver = resolver;
    }
}

The problem I am having is that when I try to use this line, memberDetail.DataFields.RegisterCode = GetCode(); The DataFields is null. Obviously, Autofac is not creating it while it constructs the MemberDetail object.


Solution

  • MemberDetail does not show a dependency on IDataFields in its constructor.

    So Autofac does not create an instance for that dependency.

    Adding a dependency like this would inject an instance:

    public class MemberDetail : IMemberDetail
    {     
      public String Email { get; set; }
      public IDataFields DataFields { get; set; }
    
      public MemberDetail(IDataFields dataFields)
      {
        DataFields = dataFields;
      }
    }
    

    I also changed the DataFields member type to IDataFields to make the dependency on the interface.