Autofac не создает сложные объекты успешно - PullRequest
0 голосов
/ 09 мая 2019

Я новичок в внедрении зависимостей на основе Autofac. В соответствии с требованиями нашей компании, я должен использовать его в новом веб-API, который я создаю. Ниже мой код. Я использую класс IocConfig для Autofac для создания и добавления объектов в мой веб-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;
    }
}

Проблема в том, что когда я пытаюсь использовать эту строку, memberDetail.DataFields.RegisterCode = GetCode (); Данные поля являются нулевыми. Очевидно, что Autofac не создает его, пока создает объект MemberDetail.

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

MemberDetail объект был создан правильно. Чего вам не хватает, так это инициализации свойства DataFields. Добавьте конструктор в класс DataFields и инициализируйте там свойство DataFields, и ваша проблема исчезнет.

0 голосов
/ 09 мая 2019

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, чтобы сделать зависимость от интерфейса.

...