我正在使用实体框架在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设置为任何值。我知道DbContext中存在ILogger
,并且有很多指南说明如何为Context和EF添加和配置记录器。但是,当我想使用我的LocalDb
类时,是否每次我调用var localDb = new LocalDb(_context, _logger)
]时都要传递一个ILogger实例?
我感觉每次都必须传入一个记录器实例有点奇怪,对此必须有一个更好的解决方案。是否可以将LocalDb类添加为服务,然后将依赖项注入上下文并记录到该类中?什么是最佳做法?
我正在使用Entity Framework在ASP.NET Core 3.1中构建Web API。我的数据库上下文在Startup.cs中注册为服务:services.AddDbContext
请注意,HomeController
不是直接LocalDbContext
,而是仅将其传递给其[[real
LocalDb
。因此,您不应将LocalDbContext
注入HomeController
的构造函数中,而应直接注入LocalDb
。这可以轻松解决您的问题,因为现在LocalDb
可以在DI容器中注册,并且可以以任何依赖关系为您解决它。