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.
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.