【问题标题】:Using ApplicationDbContext with Dependency Injection in an n-layered architecture在 n 层架构中使用 ApplicationDbContext 和依赖注入
【发布时间】:2018-12-17 13:09:28
【问题描述】:

我有一个使用 Asp.Net MVC Core 2.1 构建的具有 3 层(演示 - 业务 - 数据)的应用程序

在我的表示层中,我有一个 ApplicationDbContext 类,它实例化并填充一个测试数据库:

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
    }

所述类被注入到 Startup.cs 类中(也在表示层中):

        services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
        services.AddDefaultIdentity<IdentityUser>().AddEntityFrameworkStores<ApplicationDbContext>();
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Latest);

我现在想在数据层中使用这个 ApplicationDbContext 类来保持代码分离。我最好怎么做?通过构造函数注入类似乎不起作用(严重性代码描述项目文件行抑制状态 错误 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();
       }
    //...
   }
}

架构:

【问题讨论】:

  • 这个错误发生在设计时还是运行时?这些层是在不同的程序集中分开的还是只是一个应用程序?在构造函数中传递上下文是要走的路,所以这应该可行。
  • 嗨。错误发生在设计时。这些层都包含在同一个解决方案文件中,每个都包含在一个项目中。我已经包含了架构的屏幕截图。

标签: c# asp.net-core dependency-injection dbcontext layered


【解决方案1】:

如果您想在 PizzaShop.Data 项目中保留所有与数据库相关的内容,那么您的 ApplicationDbContext 不属于您的 Web 项目。它属于您的 PizzaShop.Data 项目。

然后,您从 Web 项目中引用您的 PizzaShop.Data 项目。

【讨论】:

    【解决方案2】:

    您的 ApplicationDbContext 需要在 DataLayer 中。

    引用自下而上,即来自Presentation Layer References Business Layer References Data Layer。如果您尝试在数据层中引用表示层,则会出现交叉引用问题。 (这甚至没有意义)。

    因此,将您的 ApplicationDbContext 移动到它所属的位置,即数据层,一切都会被整理出来:)

    【讨论】:

      猜你喜欢
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-25
      • 2010-10-03
      • 1970-01-01
      • 2012-03-15
      • 2019-03-28
      相关资源
      最近更新 更多