将DbContext和ILogger注入数据库DAL构造函数,最佳实践

问题描述 投票:0回答:1

我正在使用实体框架在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 (options => {...

c# entity-framework dependency-injection core dbcontext
1个回答
3
投票

请注意,HomeController不是直接LocalDbContext,而是仅将其传递给其[[real

依赖项LocalDb。因此,您不应将LocalDbContext注入HomeController的构造函数中,而应直接注入LocalDb。这可以轻松解决您的问题,因为现在LocalDb可以在DI容器中注册,并且可以以任何依赖关系为您解决它。
© www.soinside.com 2019 - 2024. All rights reserved.