使用 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 2
从 Presentation 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] 的实例=] 和 IConfiguration
当 BaseEngine
和 ApplicationDbContext
将被创建..
有什么想法吗?
为ApplicationDbContext
创建一个public接口,就像IApplicationDbContext
一样。将它放在 BaseEngine
的构造函数中,而不是具体的 class。使 BaseEngine
构造函数受到保护。 BaseEngine
构造函数应该如下所示:
protected BaseEngine(IApplicationDbContext context)
然后,由于 TestEngine
派生自 BaseEngine
,并且 BaseEngine
需要构造函数参数,因此您必须从 TestEngine
构造函数中传递它,例如:
public TestEngine(IApplicationDbContext context) : base(context)
我对 DI
(Dependancy Injection
) 有一些疑问。我的项目在 netcore 2.0
上,层数很少(标准的 N 层架构)。我正在尝试将 EF Core 2
从 Presentation 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] 的实例=] 和 IConfiguration
当 BaseEngine
和 ApplicationDbContext
将被创建..
有什么想法吗?
为ApplicationDbContext
创建一个public接口,就像IApplicationDbContext
一样。将它放在 BaseEngine
的构造函数中,而不是具体的 class。使 BaseEngine
构造函数受到保护。 BaseEngine
构造函数应该如下所示:
protected BaseEngine(IApplicationDbContext context)
然后,由于 TestEngine
派生自 BaseEngine
,并且 BaseEngine
需要构造函数参数,因此您必须从 TestEngine
构造函数中传递它,例如:
public TestEngine(IApplicationDbContext context) : base(context)