ASP.NET Core 中的循环依赖

Mou*_*ier 3 .net c# api asp.net-web-api entity-framework-core

对于学校,我们必须使用 .NET Entity Core Framework 编写我们自己的 WebApi。我已经编写了我的 api,但是当我尝试在 swagger 中使用它时,它总是返回一个 HTTP 500 错误:内部服务器错误。我下载了 Fiddler 以开始调试,并在我的存储库中遇到了循环依赖错误,但我无法弄清楚这会发生在哪里。

接口(用于模拟测试)

public interface IVisitorRepository
{
    Visitor GetBy(string email);
    void AddVisitor(Visitor visitor);
    void SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

具体类

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经在我的管道中确定了它的范围。

这是一个基于 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();
    }
Run Code Online (Sandbox Code Playgroud)

例外:

InvalidOperationException:检测到“DigitizedApi.Models.Repositories.IVisitorRepository”类型的服务存在循环依赖关系。DigitizedApi.Models.Repositories.IVisitorRepository(DigitizedApi.Data.Repositories.VisitorRepository) -> DigitizedApi.Models.Repositories.IVisitorRepository

Tan*_*jel 5

问题是你的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;
    }
    .........
}
Run Code Online (Sandbox Code Playgroud)