使用 ApplicationDbContext 在数据访问层中使用 DI (netcore 2.0)

Use DI in Data Access Layer with ApplicationDbContext (netcore 2.0)

我对 DI (Dependancy Injection) 有一些疑问。我的项目在 netcore 2.0 上,层数很少(标准的 N 层架构)。我正在尝试将 EF Core 2Presentation Layer 移动到 Data Access Layer 并且我在 DAL 中创建了以下 classes:

namespace MyProject.Infrastructure.Implementation.MySql.Contexts 
{
    public class ApplicationDbContext : DbContext
    {
        private readonly IConfiguration _configuration;

        public ApplicationDbContext(IConfiguration configuration)
        {
            _configuration = configuration;
        }

        protected override void OnConfiguring(DbContextOptionsBuilder     optionsBuilder)
        {
            optionsBuilder.UseMySql(
                Configuration.GetConnectionString("MySql")
            );
        }

        public DbSet<Test> Test { get; set; }
    }
}

然后我为所有 DAL 引擎准备了基础 class:

namespace MyProject.Infrastructure.Implementation.MySql
{
    public class BaseEngine : IBaseEngine
    {
        private readonly ApplicationDbContext _context;

        protected ApplicationDbContext Db => _context;

        public BaseEngine(ApplicationDbContext context)
        {
            _context = context;
        }
    }
}

所以,我的常用引擎应该是这样的:

namespace MyProject.Infrastructure.Implementation.MySql
{
    public class TestEngine : BaseEngine
    {
        public List<Test> GetTestList()
        {   
            return Db.Test.ToList();
        }
    }
}

问题是我收到错误,BaseEngine 需要在构造函数中传递参数,我不想手动创建所有实例,我需要以某种方式使用 Dependancy Injection 自动创建 [=22] 的实例=] 和 IConfigurationBaseEngineApplicationDbContext 将被创建..

有什么想法吗?

ApplicationDbContext创建一个public接口,就像IApplicationDbContext一样。将它放在 BaseEngine 的构造函数中,而不是具体的 class。使 BaseEngine 构造函数受到保护。 BaseEngine 构造函数应该如下所示:

protected BaseEngine(IApplicationDbContext context)

然后,由于 TestEngine 派生自 BaseEngine,并且 BaseEngine 需要构造函数参数,因此您必须从 TestEngine 构造函数中传递它,例如:

public TestEngine(IApplicationDbContext context) : base(context)