Подготовка Asp.net Core: Создание Собственной Кроссплатформенной Модульной Платформы

Продолжаем нашу рубрику на тему ASP.NET Core очередной публикацией от Дмитрия Сикорского ( ДмитрийСикорский ) — руководитель компании «Убраянцы» из Украины.

На этот раз Дмитрий рассказывает о своем опыте разработки модульного кроссплатформенного фреймворка на базе ASP.NET Core. Предыдущие статьи рубрики всегда можно прочитать по ссылке.

#aspnetcolumn — Владимир Юнев В силу специфики моей задачи в последнее время я много думаю о модульной и расширяемой архитектуре веб-приложений на ASP.NET Core (а до этого на предыдущей версии ASP.NET).

Результатом является ExtCore, небольшая кроссплатформенная платформа с открытым исходным кодом, которая позволяет вам буквально подключить пакет NuGet, чтобы сделать ваше веб-приложение модульным и расширяемым.



Подготовка ASP.NET Core: создание собственной кроссплатформенной модульной платформы



Ключевая особенность

ExtCore может обнаруживать и использовать типы (а также представления и статический контент), определенные как в проектах (в виде исходного кода или пакетов NuGet), на которые явно ссылаются в зависимостях, так и в проектах, которые расположены в определенной папке в форма скомпилированных сборок DLL. Для удобства по желанию эти проекты можно условно объединить в расширения (то есть каждое расширение может состоять из одного или нескольких проектов).

Также у каждого расширения может быть класс (в одном из проектов), реализующий интерфейс IExtension, а ExtCore, в свою очередь, позволяет в любой момент получить доступный набор экземпляров всех классов, реализующих этот интерфейс.

Эти классы можно использовать для предоставления метаданных, описывающих расширения, инициализации расширений (например, регистрации маршрутов) и т. д. Хотя сам фреймворк не содержит напрямую никакого функционала, связанного с работой с данными, все необходимое для этого (в том числе единый контекст хранения для всех расширений) реализовано в расширении ExtCore.Data, о котором речь пойдет ниже.



Подготовка ASP.NET Core: создание собственной кроссплатформенной модульной платформы

Совет! Вы можете попробовать сами или загрузив исходный код с GitHub. https://github.com/ExtCore/ExtCore-Sample .



Как это работает



Подготовка ASP.NET Core: создание собственной кроссплатформенной модульной платформы

При запуске приложения ExtCore обнаруживает все сборки (те, на которые есть явная ссылка, и те, на которые нет явной ссылки, но которые расположены в определенной папке).

Выбираются и загружаются только сборки, содержащие ссылку на ExtCore.Infrastructure. Далее все обнаруженные сборки, соответствующие критериям отбора, помещаются в класс-контейнер ExtensionManager, откуда их можно получить в любой момент из любого места (то есть как из основного проекта приложения, так и из любого другого проекта).

Эти сборки «регистрируются» как источники для поиска контроллеров (все контроллеры из сборок, имеющие явные ссылки, обнаруживаются ASP.NET автоматически, а об остальных необходимо сообщать дополнительно, «вручную»), представления (оба в виде ресурсов и предварительно скомпилированный) и статический контент. Затем среди экземпляров доступных реализаций этого интерфейса выполняется ряд методов IExtension. Это дает расширениям возможность выполнять свой код во время выполнения методов ConfigurationServices, Настройка и т. д.

Рекомендуемая структура расширения

Чтобы упростить понимание и поддерживать согласованность, при разработке собственных расширений удобно следовать следующей структуре (где X — имя вашего расширения):
  • ВашеПриложение.

    X;

  • ВашеПриложение.

    X.Фронтенд;

  • ВашеПриложение.

    X.Бэкенд;

  • ВашеПриложение.

    X.Data.Models;

  • ВашеПриложение.

    X.Data.Abstractions;

  • ВашеПриложение.

    X.Data.SpecificStorageA;

  • ВашеПриложение.

    X.Data.SpecificStorageB;

  • ВашеПриложение.

    X.Data.SpecificStorageC;

  • и так далее.

Ваше приложение.

Икс Крупный проект расширения.

Содержит класс, реализующий интерфейс IExtension, а также общие классы, используемые в других проектах.

Если расширение не содержит разных областей (например, фронтенда и бэкенда), то в этот проект также можно поместить вещи, связанные с пользовательским интерфейсом (контроллеры, модели представлений, представления и т. д.).

YourApplication.X.Frontend и YourApplication.X.Backend Проекты названы так только для примера.

Мне кажется удобным таким образом разделять разные части пользовательского интерфейса (особенно при работе в команде).

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

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

ExtCore поддерживает два варианта работы с представлениями (одновременно): представления ресурсов и предварительно скомпилированные представления.

Короче говоря, я рекомендую использовать второй вариант. Подробнее о методах работы с представлениями, используемых в ExtCore, вы можете прочитать в статье Подготовка ASP.NET Core: поговорим о нестандартных подходах при работе с представлениями .

Работать со статическим контентом также легко.

В статье Подготовка ASP.NET Core: как представить статический контент в качестве ресурсов Подробно описан метод, используемый в ExtCore. Подводя итог статьи, необходимый статический контент помещается в сборки в виде ресурсов и затем эти сборки «регистрируются» как файловые провайдеры, что дает возможность использовать ресурсы почти как обычные физические файлы (в том числе с прямым доступом по HTTP).

.

Интересно, что областью действия как представлений, так и статического контента является все приложение.

Это означает, что некоторые расширения могут использовать содержимое других расширений и наоборот. Более того, расширения могут использовать представления и статический контент из основного веб-приложения.

Таким образом вы можете, например, описывать логику в проектах расширения, но при этом позволить пользователю определять, как все будет правильно выглядеть в основном приложении.

Ваше приложение.

ИКС.

Данные.

* Проекты, описывающие работу с данными.

Подробнее об этом ниже.

Работа с данными ExtCore дополнительно имеет опциональное расширение ExtCore.Data, реализующее весь необходимый базовый функционал для работы с данными.

Центральным элементом расширения является интерфейс IStorage (единица работы).

Этот интерфейс описывает только 2 метода: GetRepository и Save. Реализация GetRepository обнаруживает и возвращает доступный экземпляр репозитория, который реализует запрошенный интерфейс (а также IRepository) и гарантирует, что все репозитории имеют единый контекст хранения (интерфейс IStorageContext).

Если требуется какая-то регистрация типов сущностей из различных расширений (как, например, в случае с EntityFramework), этого можно легко добиться с помощью чего-то вроде интерфейса IModelRegistrar, который используется в ExtCore.Data.EntityFramework.Sqlite и ExtCore. Данные.

EntityFramework.SqlServer. Тестовый проект (ссылка на него в конце статьи) иллюстрирует этот подход. Структура расширения следующая:

  • ExtCore.Данные;
  • ExtCore.Data.Models.Abstractions;
  • ExtCore.Data.Abstractions;
  • ExtCore.Data.EntityFramework.Sqlite;
  • ExtCore.Data.EntityFramework.SqlServer.
ExtCore.Данные Проект содержит класс, реализующий интерфейс IExtension. Этот класс при запуске приложения запускает код, который обнаруживает доступную реализацию интерфейса IStorage (см.

ниже) и регистрирует ее с помощью встроенного DI-кода ASP.NET Core, чтобы любой контроллер мог затем получить его экземпляр при необходимости.

Удобно, что вы можете изменить поддерживаемый тип хранилища, просто изменив ссылку на зависимости или скопировав файл DLL. ЭкстЯдро.

Данные.

Модели.

Абстракции Проект описывает интерфейс IEntity, который должны реализовать все сущности во всех расширениях.

ЭкстЯдро.

Данные.

Абстракции В проекте описаны ключевые интерфейсы IStorageContext, IStorage и IRepository, которые я описал выше.

В своих собственных расширениях я помещаю интерфейсы репозитория в проекты с такими именами, как YourApplication.X.Data.Abstractions, чтобы затем можно было работать с ними, не привязываясь к конкретной реализации репозитория.

ЭкстЯдро.

Данные.

EntityFramework. SQLite и ЭкстЯдро.

Данные.

EntityFramework. SQLServer Проект содержит классы, реализующие интерфейсы из ExtCore.Data.Abstractions для конкретных хранилищ (в данном случае Sqlite и SqlServer).



выводы

На данный момент это только альфа-версия.

У меня много планов по развитию проекта (подключение и отключение расширений в любой момент и общая оптимизация; также хочу поработать над классом ExtensionManager, добавить удобную возможность получения доступных реализаций заданных интерфейсов, а не только IExtension).

Я использую эту структуру в своем проекте (CMS).

Насколько я могу судить, это оказалось удобно и гибко.

Буду рад услышать комментарии и критику.

Спасибо! Вот ссылка на источники: https://github.com/ExtCore/ExtCore .

А вот ссылка на готовый тестовый проект: https://github.com/ExtCore/ExtCore-Sample .



Авторам

Друзья, если вы заинтересованы поддержать рубрику собственным материалом, пишите мне на почту [email protected] чтобы обсудить все детали.

Мы ищем авторов, которые смогут интересно рассказать об ASP.NET и других темах.



Подготовка ASP.NET Core: создание собственной кроссплатформенной модульной платформы



Об авторе

Сикорский Дмитрий Александрович Компания «Убраянцы» (г.

http://ubrainians.com/ ) Владелец, менеджер ДмитрийСикорский

Объявление! Глубокий интенсив на конференции DevCon 2016



Подготовка ASP.NET Core: создание собственной кроссплатформенной модульной платформы

Мы рады объявить об углубленном ускоренном курсе по ASP.NET Core на [DevCon 2016]( https://events.techdays.ru/DevCon/2016/registration ).

Этот курс пройдет во второй день конференции и займет полный день конференции продолжительностью 6 часов.

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

А попутно участники смогут остановиться на изучении внутренней структуры ASP.NET, работе с реляционными и NoSQL базами данных с использованием Entity Framework 7, разработке приложений с использованием фреймворка MVC, построении моделей, представлений и бизнес-логики, создании REST. API, организация процессов непрерывной разработки и тестирования с помощью Git и Visual Studio Online, а также развертывание с помощью контейнеров Azure и Docker. В конце пути все участники получат посвящение и станут почетными рыцарями ASP.NET. Регистрация на DevCon 2016 уже открыта! Зарегистрируйтесь здесь .

Теги: #.

NET #asp.net core #ASP.NET #ASP #ASP #web framework ##aspnetcolumn ##aspnetcolumn #extcore

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.