Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Autofac未成功创建复杂对象_C#_Asp.net Web Api2_Autofac - Fatal编程技术网

C# Autofac未成功创建复杂对象

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

我不熟悉基于Autofac的依赖项注入。根据我们公司的要求,我必须在我正在创建的新web API中使用它。下面是我的代码。我正在使用Autofac的IocConfig类在我的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;
    }
}
公共类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属性可能不会像您所想的那样。通过构造函数和属性进行注入更为常见。