Autofac выдает ошибку NullReferenceException

230
31 мая 2017, 02:40

Имеется класс:

 public class FileRepository : IFileRepository
 {
      private readonly string _connectionString;
      private readonly IUserStore _usersRepository;
      public FileRepository(string connectionString, IUserStore user)
      {     
           _connectionString = connectionString;      
           _usersRepository = user;
      }
      public void GetInfo()
      {
          _usersRepository.Get();
      }
 }

Второй класс:

 public class ShareRepository : IShareRepository
 {
      private readonly string _connectionString;
      private readonly IFileRepository _fileRepository;
      public ShareRepository(string connectionString, IFileRepository 
             fileRepository)
      {
           _connectionString = connectionString;
           _fileRepository = fileRepository;
      }
      public void GetTest()
      {
           _fileRepository.GetInfo()
      }          
 }

При выполнении _fileRepository.GetInfo() вызывается метод GetInfo() из класса FileRepository, который в свою очередь тоже использует DI и выполняет _usersRepository.Get() и здесь возникает ошибка:

  System.NullReferenceException: "Ссылка на объект не указывает на экземпляр объекта."

Мой Autofac config:

  var connectionString = "......."
  builder.Register(ctx => new FileRepository(connectionString, new 
      UserRepository(connectionString)))
            .As<IFileRepository>();
  builder.Register(ctx => new ShareRepository(connectionString,
       new FileRepository(connectionString))).As<IShareRepository>();

Дополнение:

 builder.RegisterType<UserRepository>().As<IUserStore>.InstancePerRequest()
Answer 1

Лучше, если не вы будете создавать объекты вручную, а DI-контейнер будет создавать их за вас:

builder.Register(ctx => new ShareRepository(connectionString,
   new FileRepository(connectionString))).As<IShareRepository>();

Вот здесь вы создали ShareRepository вручную и ему передали вручную же созданный вами FileRepository без второго параметра. Подозреваю, у вас там = null примостилось где-то в конструкторе, поэтому userRepository и равен null.

Что нужно сделать — зарегистрировать соответствие типов и интерфейсов:

builder.RegisterType<FileRepositorty>()
       .As<IFileRepository>();
builder.RegisterType<ShareRepository>()
       .As<IShareRepository>();

Если хотите указать connectionString в качестве параметра, используйте методWithParameter.

READ ALSO
Как обрабатывать ботом сообщения -Telegram Bot Api C#

Как обрабатывать ботом сообщения -Telegram Bot Api C#

Как обрабатывать ботом сообщения, которые будут приходить, только тогдда, когда я запущу программу? Сейчас у меня так как на скрине, и когда...

245
Как сделать выравнивание в FrameworkElementFactory?

Как сделать выравнивание в FrameworkElementFactory?

Так не работает выравнивание:

199
Как измерить текст в Document-е RichTextBox

Как измерить текст в Document-е RichTextBox

Привет всемКак можно измерить ширину\высоту Document-а RichTextBox-a если в нем разные размеры шрифта

250
DateTime из .xml в БД [требует правки]

DateTime из .xml в БД [требует правки]

всем привет естьxml вида

233