在 n 层架构中使用 ApplicationDbContext 和依赖注入
Using ApplicationDbContext with Dependency Injection in an n-layered architecture
我有一个使用 Asp.Net MVC Core 2.1
构建的 3 层应用程序(演示 - 业务 - 数据)
在我的表示层中,我有一个 ApplicationDbContext class,它实例化并填充测试数据库:
public class ApplicationDbContext : IdentityDbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
SeedData(builder);
}
// Database Tables
public DbSet<Customer> Customers { get; set; }
public DbSet<Ingredient> Ingredients { get; set; }
public DbSet<Order> Orders { get; set; }
public DbSet<OrderDetail> OrderDetails { get; set; }
public DbSet<Pizza> Pizzas { get; set; }
public DbSet<PizzaIngredient> PizzaIngredients { get; set; }
// Fill Database with sample data
private void SeedData(ModelBuilder builder)
{
// Seed data
}
表示class是在Startup.cs内注入class(也是在表示层):
services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<IdentityUser>().AddEntityFrameworkStores<ApplicationDbContext>();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Latest);
我现在想在数据层中使用这个 ApplicationDbContext class 来保持代码分离。我最好怎么做呢?通过构造函数注入 class 似乎不起作用(严重性代码描述项目文件行抑制状态
错误 CS0246 找不到类型或命名空间名称 'ApplicationDbContext'(是否缺少 using 指令或程序集引用?))
namespace PizzaShop.Data.Repositories
{
public class PizzaRepo : IPizzaRepo
{
private readonly ApplicationDbContext _context;
public PizzaRepo(ApplicationDbContext context)
{
_context = context;
}
public async Task<int> AddEntityAsync(Pizza entity)
{
_context.Pizzas.Add(entity);
return await _context.SaveChangesAsync();
}
//...
}
}
架构:
如果您想将所有与数据库相关的内容保留在 PizzaShop.Data 项目中,那么您的 ApplicationDbContext
不属于您的 Web 项目。它属于您的 PizzaShop.Data 项目。
然后您从网络项目中引用您的 PizzaShop.Data 项目。
您的 ApplicationDbContext 需要在 DataLayer 中。
引用从下到上,这意味着从 Presentation Layer References Business Layer References Data Layer
。如果您尝试在数据层中引用表示层,则会出现交叉引用问题。 (它甚至没有意义)。
因此,将您的 ApplicationDbContext 移动到它所属的位置,即数据层,一切都会得到解决:)
我有一个使用 Asp.Net MVC Core 2.1
构建的 3 层应用程序(演示 - 业务 - 数据)在我的表示层中,我有一个 ApplicationDbContext class,它实例化并填充测试数据库:
public class ApplicationDbContext : IdentityDbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
SeedData(builder);
}
// Database Tables
public DbSet<Customer> Customers { get; set; }
public DbSet<Ingredient> Ingredients { get; set; }
public DbSet<Order> Orders { get; set; }
public DbSet<OrderDetail> OrderDetails { get; set; }
public DbSet<Pizza> Pizzas { get; set; }
public DbSet<PizzaIngredient> PizzaIngredients { get; set; }
// Fill Database with sample data
private void SeedData(ModelBuilder builder)
{
// Seed data
}
表示class是在Startup.cs内注入class(也是在表示层):
services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<IdentityUser>().AddEntityFrameworkStores<ApplicationDbContext>();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Latest);
我现在想在数据层中使用这个 ApplicationDbContext class 来保持代码分离。我最好怎么做呢?通过构造函数注入 class 似乎不起作用(严重性代码描述项目文件行抑制状态 错误 CS0246 找不到类型或命名空间名称 'ApplicationDbContext'(是否缺少 using 指令或程序集引用?))
namespace PizzaShop.Data.Repositories
{
public class PizzaRepo : IPizzaRepo
{
private readonly ApplicationDbContext _context;
public PizzaRepo(ApplicationDbContext context)
{
_context = context;
}
public async Task<int> AddEntityAsync(Pizza entity)
{
_context.Pizzas.Add(entity);
return await _context.SaveChangesAsync();
}
//...
}
}
架构:
如果您想将所有与数据库相关的内容保留在 PizzaShop.Data 项目中,那么您的 ApplicationDbContext
不属于您的 Web 项目。它属于您的 PizzaShop.Data 项目。
然后您从网络项目中引用您的 PizzaShop.Data 项目。
您的 ApplicationDbContext 需要在 DataLayer 中。
引用从下到上,这意味着从 Presentation Layer References Business Layer References Data Layer
。如果您尝试在数据层中引用表示层,则会出现交叉引用问题。 (它甚至没有意义)。
因此,将您的 ApplicationDbContext 移动到它所属的位置,即数据层,一切都会得到解决:)