Использование ApplicationDbContext с внедрением зависимостей в n-уровневой архитектуре - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть приложение с 3 уровнями (Presentation - Business - Data), созданное с использованием Asp.Net MVC Core 2.1

В моем уровне Presentation у меня есть класс 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();
       }
    //...
   }
}

Архитектура: enter image description here

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Ваш ApplicationDbContext должен быть в DataLayer.

Ссылки идут снизу вверх, что означает от Presentation Layer References Business Layer References Data Layer.Если вы попытаетесь сослаться на уровень представления данных на уровне данных, возникнут проблемы перекрестных ссылок.(это даже не имеет смысла).

В результате переместите ваш ApplicationDbContext туда, где он находится, то есть на уровень данных, и все будет отсортировано:)

0 голосов
/ 17 декабря 2018

Если вы хотите сохранить все связанные с базой данных в проекте PizzaShop.Data, то ваш ApplicationDbContext не принадлежит вашему веб-проекту.Он принадлежит вашему проекту PizzaShop.Data.

Затем вы ссылаетесь на ваш проект PizzaShop.Data из веб-проекта.

...