Круговая зависимость в ASP.NET Core - PullRequest
1 голос
/ 17 марта 2019

Для школы мы должны написать свой собственный WebApi, используя .NET Entity Core Framework.Я написал свой API, но когда я пытался использовать его в Swagger, он всегда возвращал ошибку 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();
    }
}

Я определил это в своем конвейере.

Это вход в систему на основе токена JWT и регистрация API (вот что нам нужно сделать), и вот мой метод регистрации (метод, который я тестирую)

    [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: обнаружена циклическая зависимость для службы типа 'DigitizedApi.Models.Repositories.IVisitorRepository'.DigitizedApi.Models.Repositories.IVisitorRepository (DigitizedApi.Data.Repositories.VisitorRepository) -> DigitizedApi.Models.Repositories.IVisitorRepository

1 Ответ

4 голосов
/ 17 марта 2019

Проблема в том, что ваш 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;
    }
    .........
}
...