Как собрать Чистую архитектуру и IHostingStartup и IConfiguration? - PullRequest
0 голосов
/ 30 ноября 2018

Попытка реализовать чистую архитектуру в новом проекте, но с некоторыми ограничениями: я хочу максимально потерять зависимости.

Базовый:

Решение имеет несколько проектов:

  • WebApi

  • UseCases (на который ссылается WebApi, реализует бизнес-логику)

  • Gateway (на что указывает UseCases, предоставляет интерфейсы репозитория для UseCases)

  • DataAccess.EfCore (на который ссылается Gateway, реализует доступ к MSSQL)

  • Domain.Core (модель домена здесь)

Что нужно и какие проблемы решаются и остаются здесь: - Все проекты имеют IHostingStartup реализаций, где они* сами настраивают: UseCases регистрируют некоторые поведения, Gateway - это интерфейсы, EfCore - настраивают DbContext и регистрируют его.

выглядит хорошо.Почти.На данный момент есть две архитектурные проблемы:

  1. Настройка идентификации ядра ASP.NET.Обычно это делается в проекте WebApi, но в этом случае я должен ссылаться на проект EfCore, чтобы иметь возможность написать это:

services.AddIdentity<User, Role>().AddEntityFrameworkStores<MyDbContext>();

class "MyDbContext "объявлено в проекте EfCore, поэтому эта строка содержит настройки из двух миров:

  • AddIdentity (): мир WebApi

  • AddEntityFrameworkStores (): мир DataAccess (поскольку к нему принадлежит класс «MyDbContext»)

Если я поместил конфигурацию Identity в DataAccess - тогда мне придется настроить такие вещи, какНастройки блокировки идентификации и страницы Login / AccessDenied в DataAccess, что также не так, и что не следует делать там.Можно ли разделить конфигурацию, поэтому DataAccess.EfCore просто зарегистрирует DbContext хранилище для идентификации, а WebApi настраивает блокировки и другие вещи?

Я использую пользовательские секреты для хранения строк подключения.Как передать его в реализацию IHostingStartup для настройки DbContext?Подпись метода позволяет работать только с IWebHostBuilder builder, поэтому я застрял и здесь.

Любые идеи, помощь, опыт?

UPD: Или почти забыли о3-я задача:

Когда я запускаю приложение в первый раз - я хочу поместить некоторые данные в БД.И проблема здесь в том, чтобы заполнить IdentityUser сущности, как они должны быть добавлены через UserService (хеширование паролей и т. Д.), Но в то же время я хочу сделать это в проекте DataAccess.EfCore: я использую FluentAPI для настройки моделей и заполнения данных методом «HasData».Так что любая идея здесь также будет оценена!

1 Ответ

0 голосов
/ 10 февраля 2019

если вы ссылаетесь с помощью «Чистой архитектуры» на статью и книгу дяди Бобса (https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html), то настройка вашего проекта требует небольшой очистки.

В Чистой архитектуре шлюзы зависят от вариантов использования, а не отнаоборот. Одним из ключевых принципов в этой архитектуре является «инверсия управления»: вы определяете интерфейсы во внутренних кругах и сохраняете детали реализации (например, EF, DbContext и другие структуры) во внешних кругах.

подключение интерфейсов и реализаций происходит в «главном компоненте», который в ядре asp.net будет классом запуска.

Более подробную информацию о реализации чистой архитектуры (например, в Asp.Net) вы можете найти в моемсерия блогов: http://www.plainionist.net/Implementing-Clean-Architecture/

...