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
问题是你的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)
归档时间: |
|
查看次数: |
3217 次 |
最近记录: |