Имеется класс:
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()
Лучше, если не вы будете создавать объекты вручную, а 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.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости