C# Autofac未成功创建复杂对象
我不熟悉基于Autofac的依赖项注入。根据我们公司的要求,我必须在我正在创建的新web API中使用它。下面是我的代码。我正在使用Autofac的IocConfig类在我的Web API中创建和注入对象C# Autofac未成功创建复杂对象,c#,asp.net-web-api2,autofac,C#,Asp.net Web Api2,Autofac,我不熟悉基于Autofac的依赖项注入。根据我们公司的要求,我必须在我正在创建的新web API中使用它。下面是我的代码。我正在使用Autofac的IocConfig类在我的Web API中创建和注入对象 public class MemberCodeController : ApiController { private IMemberStrategy memberStrategy; private IMemberDetail memberDetail; //Cons
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;
}
}
公共类IocConfig
{
//自动传真配置
公共静态void Configure()
{
ContainerBuilder=新的ContainerBuilder();
RegisterAppController(Assembly.getExecutionGassembly());
builder.RegisterType().As();
builder.RegisterType().As();
builder.RegisterType().As();
IContainer容器=builder.Build();
AutofacWebApiDependencyResolver解析程序=新建
AutofacWebApidencyResolver(容器);
GlobalConfiguration.Configuration.DependencyResolver=解析程序;
}
}
我遇到的问题是,当我尝试使用这条线路时,
memberDetail.DataFields.RegisterCode=GetCode();
数据字段为空。显然,Autofac在构造MemberDetail对象时没有创建它。MemberDetail在其构造函数中没有显示对IDataFields的依赖关系 因此,Autofac不会为该依赖项创建实例 添加这样的依赖项将注入一个实例:
public class MemberDetail : IMemberDetail
{
public String Email { get; set; }
public IDataFields DataFields { get; set; }
public MemberDetail(IDataFields dataFields)
{
DataFields = dataFields;
}
}
我还将DataFields成员类型更改为IDataFields,使其依赖于接口。MemberDetail对象已正确创建。您缺少的是数据字段属性的初始化。将构造函数添加到DataFields类中并初始化DataFields属性,问题就会消失。但是,有PropertiesAutowired属性可能不会像您所想的那样。通过构造函数和属性进行注入更为常见。