Для школы нам нужно написать собственный WebApi с использованием .NET Entity Core Framework. Я написал свой API, но когда я пытался использовать его в чванстве, он всегда возвращал ошибку HTTP 500: внутренняя ошибка сервера. Я скачал Fiddler, чтобы начать отладку, и столкнулся с круговой ошибкой зависимости в моем репозитории, но я не могу понять, где это может произойти.
Интерфейс (для пробного тестирования)
public interface IVisitorRepository
{
Visitor GetBy(string email);
void AddVisitor(Visitor visitor);
void SaveChanges();
}
Конкретный класс
public class VisitorRepository : IVisitorRepository
{
private readonly ApplicationDbContext _context;
private readonly DbSet<Visitor> _visitors;
public VisitorRepository(ApplicationDbContext context, IVisitorRepository visitorRepository)
{
_context = context;
_visitors = _context.Visitors;
}
public void AddVisitor(Visitor visitor)
{
_visitors.Add(visitor);
}
public Visitor GetBy(string email)
{
return _visitors.SingleOrDefault(v => v.Email == email);
}
public void SaveChanges()
{
_context.SaveChanges();
}
}
Я рассмотрел это в своем конвейере.
Это API для входа и регистрации на основе токена JWT (это то, что нам нужно сделать), и вот мой метод регистрации (метод, который я тестирую)
[AllowAnonymous]
[HttpPost("register")]
public async Task<ActionResult<String>> Register(RegisterDTO model)
{
IdentityUser user = new IdentityUser { UserName = model.Email, Email = model.Email };
Visitor visitor = new Visitor(model.FirstName + " " + model.LastName, model.Email, model.PhoneNumber, model.Country);
var result = await _userManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
_visitorRepository.AddVisitor(visitor);
_visitorRepository.SaveChanges();
string token = GetToken(user);
return Created("", token);
}
return BadRequest();
}
Исключение:
InvalidOperationException: A circular dependency was detected for the service of type 'DigitizedApi.Models.Repositories.IVisitorRepository'. DigitizedApi.Models.Repositories.IVisitorRepository(DigitizedApi.Data.Repositories.VisitorRepository) -> DigitizedApi.Models.Repositories.IVisitorRepository
@FedericoDipuma вау, это было глупо, большое спасибо, это исправило!





Проблема в том, что ваш VisitorRepository (который реализует IVisitorRepository) зависит от самого IVisitorRepository.
На самом деле должно быть так:
public class VisitorRepository : IVisitorRepository
{
private readonly ApplicationDbContext _context;
private readonly DbSet<Visitor> _visitors;
public VisitorRepository(ApplicationDbContext context)
{
_context = context;
_visitors = _context.Visitors;
}
.........
}
Ваш
VisitorRepository(который реализуетIVisitorRepository) зависит отIVisitorRepository(самого себя). Проверьте конструктор.