OSharp Framework

OSharp 简介
OSharp是一个基于.Net6.0+开发的一个.Net快速开发框架。这个框架使用最新稳定版的.Net SDK(当前是.NET 6.0),对 AspNetCore 的配置、依赖注入、日志、缓存、实体框架、Mvc(WebApi)、身份认证、权限授权等模块进行更高一级的自动化封装,并规范了一套业务实现的代码结构与操作流程,使 .Net Core 框架更易于应用到实际项目开发中。
项目地址
相关示例项目:
框架组件组织
Компоненты OSharp организованы следующим образом:
-
OSharp — ядро фреймворка, содержит набор вспомогательных инструментов и основные интерфейсы для компонентов.
-
OSharp.AspNetCore — компоненты для разработки серверной части на основе AspNetCore.
-
OSharp.Authorization.Datas — компоненты авторизации для управления доступом к данным.
-
OSharp.Authorization.Functions — компоненты авторизации для контроля доступа к функциям.
-
OSharp.AutoMapper — компонент для работы с объектами на основе AutoMapper.
-
OSharp.EntityFrameworkCore — набор компонентов для работы с данными на базе EntityFrameworkCore. Включает в себя подкомпоненты для разных баз данных.
-
OSharp.Hangfire — компоненты для реализации фоновых задач на основе Hangfire.
-
OSharp.Identity — компоненты аутентификации на основе Identity.
-
OSharp.IdentityServer — компоненты на основе IdentityServer4 для аутентификации и авторизации клиентов.
-
OSharp.Log4Net — компоненты логирования на основе Log4Net.
-
OSharp.MiniProfiler — компоненты мониторинга производительности на основе MiniProfiler.
-
OSharp.NLog — компоненты логирования на основе NLog.
-
OSharp.Redis — компоненты распределённого кеширования на основе Redis.
-
OSharp.Swagger — компоненты генерации API на основе Swagger.
-
OSharp.Wpf — компоненты для создания клиентских приложений на WPF.
-
OSharp.Hosting.Core — нефункциональные компоненты ядра фреймворка.
-
OSharp.Hosting.EntityConfiguration — конфигурация EFCore для нефункциональных компонентов ядра.
-
OSharp.Hosting.Apis — реализация WebAPI для нефункциональных компонентов ядра. |OSharp.EntityFrameworkCore.SqlServer|OSharp.EntityFrameworkCore.MySql|OSharp.EntityFrameworkCore.Sqlite|OSharp.EntityFrameworkCore.PostgreSql|OSharp.Hangfire|OSharp.Identity|
|---|---|---|---|---|-----|
|OSharp.EntityFrameworkCore.SqlServer|
|
|
| | |
|OSharp.EntityFrameworkCore.MySql|
|
|
| | |
|OSharp.EntityFrameworkCore.Sqlite|
|
|
| | |
|OSharp.EntityFrameworkCore.PostgreSql|
|
|
|| |
|OSharp.Hangfire|
|
|
|| |
||OSharp.Identity|
|
|
||| |OSharp.Log4Net|OSharp.MiniProfiler|OSharp.Redis|OSharp.Exceptionless|OSharp.Swagger|OSharp.Wpf|OSharp.Hosting.Core|OSharp.Hosting.EntityConfiguration|
|---|---|---|---|---|---|---|---|
|OSharp.Log4Net|
|
|
|
|OSharp.MiniProfiler|
|
|
|
|OSharp.Redis|
|
|
|
|OSharp.Exceptionless|
|
|
|
|OSharp.Swagger|
|
|
|
|OSharp.Wpf|
|
|
|
|OSharp.Hosting.Core|
|
|
|
|OSharp.Hosting.EntityConfiguration|
|
|
| |OSharp.Hosting.Apis|
|---|---|
|OSharp.Hosting.Apis|
|
|
|
|OSharpNS|
|OSharpNS|
|
|
|
|[OSharp.Template.WebApi]|
|OSharp.Template.WebApi|
|
| |
OSharp особенности
1. Модульный дизайн компонентов
В рамках фреймворка разработана система модулей (Pack), все классы, которые реализуют базовый класс модуля (OsharpPack), рассматриваются как отдельный модуль. Модуль может независимо добавлять сервисы (AddServices) и применять их при инициализации (UsePack).
2. Автоматизированный механизм внедрения зависимостей
Фреймворк определяет интерфейс ISingletonDependency, IScopeDependency и ITransientDependency, соответствующие трём типам жизненного цикла сервисов в DependencyInjection. Во время инициализации системы посредством рефлексии происходит поиск всех типов сервисов (ServiceType) и реализаций сервисов (ImplementationType), а также типов жизненного цикла (ServiceLifetime). Затем выполняется автоматическая инициализация ServiceCollection для внедрения зависимостей.
3. UnitOfWork-Repository шаблон, динамическое построение контекста EFCore
-
В модуле данных используется шаблон UnitOfWork-Repository. Разработан универсальный интерфейс репозитория сущностей IRepository<TEntity,TKey>, который позволяет избежать необходимости реализации репозиториев для каждой сущности. Для управления транзакциями разработан интерфейс IUnitOfWork. Через UnitOfWork управляется создание DbContext, обеспечивая использование одного и того же объекта DbConnection для соединений с одинаковой строкой подключения к базе данных, что позволяет синхронизировать транзакции между несколькими контекстами.
-
На основе MVC реализован фильтр действий UnitOfWorkAttribute, который автоматически фиксирует транзакции AOP. В бизнес-логике больше не нужно заботиться о жизненном цикле транзакций.
-
Во время инициализации системы через рефлексию происходит поиск сопоставлений между сущностями и контекстом. Эти сопоставления используются для динамического построения контекста на основе типа контекста. Сопоставление сущностей с контекстом осуществляется через общий базовый класс EntityTypeConfigurationBase<TEntity, TKey> с использованием FluentAPI для гибкой настройки каждого сопоставления между сущностью и базой данных.
4. Система аутентификации на основе Identity AspNetCore
-
Используется встроенная система аутентификации пользователей AspNetCore. Операции аутентификации пользователя и роли унифицированы с помощью UserManager и RoleManager.
-
Переработаны пользовательский магазин UserStore и ролевой магазин RoleStore. Они используют интерфейс данных репозитория IRepository<TEntity,TKey> для операций с данными, что обеспечивает идеальное сочетание системы аутентификации с фреймворком. Это позволяет избежать использования официального Microsoft.AspNetCore.Identity.EntityFrameworkCore, который может привести к использованию нескольких контекстов или принудительному использованию Identity контекста в качестве контекста данных для бизнеса.
5. Мощная система авторизации функций и прав доступа к данным
-
Начиная с нижнего уровня, автоматически собираются все точки бизнес-операций (IFunction) и сущности данных (IEntityInfo) в системе. Эта информация используется для обеспечения поддержки данных для таких функций, как авторизация функций, права доступа к данным, кэширование данных и аудит операций.
-
Точки функций Function соответствуют областям MVC, контроллерам и действиям один к одному. Они являются минимальными единицами проверки функциональности. На основе точек функций можно настроить:
- Тип доступа к функциям (анонимный доступ, доступ после входа в систему, ограниченный доступ по ролям);
- Время кэширования данных функций и способ истечения срока действия кэша (абсолютное истечение срока действия, относительное истечение срока действия);
- Включение аудита операций (кто выполнил операцию, когда это было сделано);
- Включение аудита данных (подробности изменений данных, вызванных операциями, такими как добавление, обновление и удаление).
-
Сущности данных EntityInfo соответствуют каждому объекту данных в базе данных один к одному. На их основе можно настроить:
- Включение аудита данных;
- Уровень конфигурации отличается от уровня функций. Если для сущности указано, что аудит данных не включён, то аудит данных этой сущности не будет проводиться.
- Частичная реализация — права доступа к данным. На основе ролей и сущностей данных реализуется дизайн прав доступа к данным «роль — сущность». С помощью конфигурации можно определить, имеет ли конкретная роль право доступа к определённым атрибутам данных сущности.
-
Разработана древовидная структура бизнес-модулей (Module), которая соответствует операционным точкам (меню/кнопкам), предоставляемым бэкэндом во внешний интерфейс. Бизнес-модуль является особым типом функциональной точки и представляет собой набор функциональных точек или одну функциональную точку. Он служит для внешнего предоставления специальных функций и является единицей распределения ролей/пользователей по функциям. Назначая модуль роли, роль получает доступ ко всем функциональным точкам, включенным в модуль.
-
Процесс распределения прав на функции
- Автоматически создаются функциональные точки Function для различных областей MVC, контроллеров и действий. Информация о функциональных точках сохраняется в базе данных.
- Создаётся информация о древовидных модулях Module, а также отношения распределения между модулями и функциональными точками (один или несколько модулей могут быть связаны с одной функциональной точкой). Информация о модулях сохраняется в базе данных.
- Модули Module распределяются по ролям Role.
- Роли Role распределяются пользователям User.
- Можно распределить модули Module непосредственно пользователям User, чтобы решить проблему привилегий.
- Таким образом, пользователи получают доступ к функциональным возможностям, соответствующим назначенным им ролям, включая все функциональные точки, связанные с модулями, назначенными этим ролям.
-
Процесс проверки прав на функции
- Во время инициализации системы автоматически создаются отношения распределения между ролями Role и функциональными точками Function, и эта информация сохраняется в кэше. При запросе авторизации и аутентификации пользователя в системе происходит следующее:
- Когда пользователь заходит в систему, автоматически запрашиваются все анонимные модули FunctionAccessType.Anonymouse и сохраняются в кэше браузера.
- На основе сохранённой информации браузер контролирует видимость и доступность кнопок и пунктов меню на странице.
- При регистрации и входе пользователя в систему автоматически запрашиваются все доступные модули (анонимные, с логином или для определённых ролей) и сохраняются в кэше браузера. Затем браузер использует эту информацию для контроля видимости и доступности кнопок и пунктов меню.
- Если пользователь хочет выполнить какую-либо функцию, происходит проверка:
- Если функция не существует, возвращается ошибка 404.
- Если функция заблокирована, возвращается ошибка 423.
- Если доступ к функции анонимный, то проверяется, есть ли у пользователя разрешение на выполнение этой функции.
- Если требуется логин для доступа к функции, а пользователь не вошёл в систему, возвращается ошибка 401. Если же пользователь уже вошёл, проверка продолжается.
- Если для выполнения функции требуется определённая роль, происходит дополнительная проверка:
- Если пользователь не вошёл в систему, возвращается ошибка 401.
- Проверяются роли пользователя и соответствующие им функции. Если есть совпадение, проверка пройдена успешно.
- Также проверяются функции, связанные с модулями, к которым имеет доступ пользователь. Если есть совпадения, проверка пройдена.
- В противном случае возвращается ошибка 403.
Далее идёт описание реализации системы управления данными:
- На основе соответствия между ролью и сущностью настраиваются правила доступа к данным для каждой роли. Эти правила сохраняются в базе данных.
- Правила доступа состоят из условий FilterGroup и FilterRule. Условие FilterGroup может содержать одно или несколько условий FilterRule, а также другие условия FilterGroup. Это позволяет создавать сложные правила доступа.
- При инициализации системы правила доступа для всех ролей сохраняются в памяти.
- Во время запроса данных система ищет все правила доступа, соответствующие текущей роли и сущности, и преобразует их в выражение для запроса данных Expression<Func<TEntity, bool>>.
- Выражение для роли объединяется с выражением для запроса пользователя с помощью оператора Or.
- Полученное выражение объединяется с запросом пользователя с помощью And и отправляется в базу данных для получения данных с учётом ограничений доступа. Отсутствие установки, выполните следующую команду для глобальной установки Angular
Angular можно быстро запустить, обратитесь к официальной документации Angular.
npm install -g @angular/cli
Использование VS Code для открытия проекта Angular
- Расположитесь в каталоге проекта src/ui/ng-alain и нажмите правой кнопкой мыши в пустом месте. Используйте VS Code, чтобы открыть проект, вы увидите следующую структуру:

-
Нажмите Ctrl+Tab, чтобы вызвать командную строку VS Code. Введите команду установки NodeJS:
npm install
-
После завершения установки введите команду запуска проекта:
npm start
Эта команда выполнит следующие команды: ng serve --port 4201 --proxy-config proxy.config.json --open
. Параметр --proxy-config proxy.config.json
используется для проксирования запросов API, отправленных из фронтенд-проекта. Все запросы, начинающиеся с /api/
, будут перенаправлены на серверный проект для обработки. Фактическая конфигурация прокси выглядит следующим образом:
{
"/api": {
"target": "http://localhost:7001",
"secure": false
}
}
На этом этапе проект запущен, и конечный результат выглядит так:

Прогресс разработки проекта
На данный момент степень готовности OSharp Framework очень высока. Запланированные функции уже реализованы на высоком уровне. Ниже представлен прогресс реализации каждой функции:
Благодарности

Опубликовать ( 0 )