【发布时间】:2020-07-28 10:04:46
【问题描述】:
我正在使用 Entity Framework 在 ASP.NET Core 3.1 中构建 Web API。
我的数据库上下文在 Startup.cs 中注册为服务:
services.AddDbContext<LocalDbContext>(options =>
{
options.UseSqlServer(builderLocal.ConnectionString);
});
我正在使用 DI 在我的控制器中检索 DbContext,并在我为每个方法实例化它时将其传递给我的数据库访问类 (DAL)
private readonly LocalDbContext _context;
public HomeController(LocalDbContext context)
{
_context = context;
}
public IActionResult GetSomeData(int id)
{
var localDb = new LocalDb(_context);
return Ok(localDb.GetSomeDataById(id));
}
然后是我的数据库文件:
public class LocalDbContext : DbContext
{
public LocalDbContext(DbContextOptions<LocalDbContext> options)
: base (options) { }
**DbSets for my models**
}
public class LocalDb
{
private readonly LocalDbContext _context;
private readonly ILogger<LocalDb> _logger;
// I would want to avoid having to pass in logger in this contstructor
public LocalDb(LocalDbContext context)
{
_context = context;
// Can I retrieve a logger from somewhere else? From the context?
// _logger = logger;
}
public void AddStudent(Student student)
{
_context.Student.Add(student);
try
{
_context.SaveChanges();
}
catch (Exception ex)
{
_logger.LogError("logMessage about exception: " + ex.StackTrace);
throw;
}
}
}
所以我希望 _logger 可以写入,但在我的代码中,我没有将 _logger 设置为任何内容。我知道ILogger 存在于 DbContext 中,并且有很多指南解释了如何为 Context 和 EF 添加和配置记录器。但是当我想使用我的LocalDb 类时,是否每次调用var localDb = new LocalDb(_context, _logger) 时都必须传入一个ILogger 实例
我觉得每次都必须传入一个记录器实例有点奇怪,必须有更好的解决方案。是否可以将 LocalDb 类添加为服务,然后将依赖项注入上下文并记录到该类中?最佳做法是什么?
【问题讨论】:
标签: c# dependency-injection entity-framework-core dbcontext