Инициализируйте контекст базы данных (уровень домена) на уровне представления через бизнес-уровень - PullRequest
0 голосов
/ 05 июля 2018

Я совершенно новый программист и имею веб-приложение ASP.NET Core. Все работало нормально, пока я не заметил, что мне нужны слои (Business, Domain и Presentation), так как я понял, что это лучшая практика. Из-за создания этих слоев возникают вопросы.

В моем запуске у меня есть метод конфигурации для инициализации базы данных. Однако, поскольку класс DishInfoContext теперь находится в проекте Domain, к нему больше нельзя обращаться напрямую из проекта Presentation.

Я пытался создать класс и метод на бизнес-уровне для внедрения DishInfoContext, но он не работает.

Способ настройки в Startup.cs:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();

        string connection = @"Server=(localdb)\mssqllocaldb;Database=DishesDB;Trusted_Connection=True;ConnectRetryCount=0";
        services.AddDbContext<DishInfoContext>(options => options.UseSqlServer(connection));

        // So, here I guess DishInfoContext should be replaced with something else?

        services.AddScoped<IDishService, DishService>();
    }

Класс DishInfoContext:

namespace MyDishesApp.Domain.Entities
{
public class DishInfoContext : DbContext
{
    public DishInfoContext(DbContextOptions<DishInfoContext> options) : base(options)
    {
        Database.Migrate();
    }

    public DbSet<Dish> Dishes { get; set; }
    public DbSet<Ingredient> Ingredients { get; set; }
}
}

Что я должен сделать, чтобы передать DishInfoContext через бизнес-уровень на уровень представления? Или я должен попробовать другой метод?

Надеюсь, я достаточно конкретен, спасибо за помощь!

PS: я также создал службы для своих репозиториев на бизнес-уровне, поскольку репозитории находятся на уровне домена.

1 Ответ

0 голосов
/ 05 июля 2018

Вы попали в ловушку следования «советам», которые вы не понимаете. Это обычное явление для новых разработчиков, поскольку существует врожденное желание делать все «правильно», но вы еще не понимаете, что это значит или влечет за собой.

Во-первых, то, что вы здесь делаете, называется N-Tier, и, хотя в течение десятилетий он был основным продуктом разработки программного обеспечения, он не всегда является правильным выбором. В частности, если вы не привыкли к шаблону и ваше приложение на самом деле не нуждается в нем, то вы можете столкнуться с серьезными проблемами и неэффективностью в вашем приложении.

Вам необходимо осознать, что здесь нет настоящего разделения. Ваше веб-приложение (то, что вы называете уровнем представления), требует подключения к базе данных. В результате, здесь есть жесткая зависимость. Максимум, на что вы можете надеяться - это абстрагировать большую часть кода, который обращается к базе данных, но вам все же нужно будет зависеть от того, что вы можете использовать в своих контроллерах для получения данных. Типичный подход здесь заключается в реализации шаблона хранилища / единицы работы. Затем он становится вашим слоем данных. Однако большинство людей упускают то, что если вы используете EF, , то - это ваш уровень данных. Доступ к данным уже абстрагирован, поэтому ваше приложение просто зависит от EF, а не от какой-то пользовательской библиотеки классов, которую вы создаете. EF - это ORM, и поэтому уже реализует шаблоны хранилища / единицы работы.

Короче говоря, просто используйте свой контекст EF прямо в своем веб-приложении. Если ваше приложение со временем станет достаточно большим / сложным, чтобы избежать абстрагирования, вам следует рассмотреть либо микросервис, либо шаблоны CQRS. Тем не менее, оба они нетривиальны и легко излишни для простого приложения.

Лучший совет, который я могу вам дать, - просто создать приложение. Не беспокойтесь о моделях или о том, что говорят другие люди. Ваше приложение определяет, какие шаблоны или архитектурные стили следует использовать, а не наоборот. Когда вы начинаете делать что-то, потому что вы "должны", это когда ваше приложение сходит с рельсов Цель всего этого - чистый, документированный и легко поддерживаемый код. Если у вас есть это с одним слоем, вам больше ничего не нужно.

...