1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/i66soft-osharp

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 38 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 28.11.2024 04:38 66862bf

OSharp Framework

Member project of .NET Core Community depoly action NuGet Badge GitHub license



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.SqlServer|OSharp.EntityFrameworkCore.SqlServer|OSharp.EntityFrameworkCore.SqlServer| | | |OSharp.EntityFrameworkCore.MySql|OSharp.EntityFrameworkCore.MySql|OSharp.EntityFrameworkCore.MySql|OSharp.EntityFrameworkCore.MySql| | | |OSharp.EntityFrameworkCore.Sqlite| OSharp.EntityFrameworkCore.Sqlite | OSharp.EntityFrameworkCore.Sqlite | OSharp.EntityFrameworkCore.Sqlite | | | |OSharp.EntityFrameworkCore.PostgreSql| OSharp.EntityFrameworkCore.PostgreSql | OSharp.EntityFrameworkCore.PostgreSql | OSharp.EntityFrameworkCore.PostgreSql || | |OSharp.Hangfire| OSharp.Hangfire | OSharp.Hangfire | OSharp.Hangfire || | ||OSharp.Identity| OSharp.Identity | OSharp.Identity | OSharp.Identity ||| |OSharp.Log4Net|OSharp.MiniProfiler|OSharp.Redis|OSharp.Exceptionless|OSharp.Swagger|OSharp.Wpf|OSharp.Hosting.Core|OSharp.Hosting.EntityConfiguration| |---|---|---|---|---|---|---|---| |OSharp.Log4Net|OSharp.Log4Net|OSharp.Log4Net|OSharp.Log4Net| |OSharp.MiniProfiler|OSharp.MiniProfiler|OSharp.MiniProfiler|OSharp.MiniProfiler| |OSharp.Redis|OSharp.Redis|OSharp.Redis|OSharp.Redis| |OSharp.Exceptionless|OSharp.Exceptionless|OSharp.Exceptionless|OSharp.Exceptionless| |OSharp.Swagger|OSharp.Swagger|OSharp.Swagger|OSharp.Swagger| |OSharp.Wpf|OSharp.Wpf|OSharp.Wpf|OSharp.Wpf| |OSharp.Hosting.Core|OSharp.Hosting.Core|OSharp.Hosting.Core|OSharp.Hosting.Core| |OSharp.Hosting.EntityConfiguration|OSharp.Hosting.EntityConfiguration|OSharp.Hosting.EntityConfiguration|OSharp.Hosting.EntityConfiguration| |OSharp.Hosting.Apis|
    |---|---| |OSharp.Hosting.Apis|OSharp.Hosting.Apis|OSharp.Hosting.Apis|OSharp.Hosting.Apis| |OSharpNS|
    |OSharpNS|OSharpNS|OSharpNS|OSharpNS| |[OSharp.Template.WebApi]|
    |OSharp.Template.WebApi|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, и эта информация сохраняется в кэше. При запросе авторизации и аутентификации пользователя в системе происходит следующее:
  1. Когда пользователь заходит в систему, автоматически запрашиваются все анонимные модули FunctionAccessType.Anonymouse и сохраняются в кэше браузера.
  2. На основе сохранённой информации браузер контролирует видимость и доступность кнопок и пунктов меню на странице.
  3. При регистрации и входе пользователя в систему автоматически запрашиваются все доступные модули (анонимные, с логином или для определённых ролей) и сохраняются в кэше браузера. Затем браузер использует эту информацию для контроля видимости и доступности кнопок и пунктов меню.
  4. Если пользователь хочет выполнить какую-либо функцию, происходит проверка:
    • Если функция не существует, возвращается ошибка 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, чтобы открыть проект, вы увидите следующую структуру:

image

  • Нажмите 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
    }
}

На этом этапе проект запущен, и конечный результат выглядит так:

image

Прогресс разработки проекта

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

  • OSharp Framework
    • OSharp
      • Добавление часто используемых вспомогательных инструментов Utility
      • Определение конфигурации Options для фреймворка
      • Определение интерфейсов доступа к данным Entity
      • Определение интерфейса модуля внедрения зависимостей
      • Разработка EventBus для проектирования событийной шины
      • Определение и реализация Mapper для объектного отображения
      • Определение информации о сущностях EntityInfo и инициализация для настройки данных журнала аудита и разрешений для каждой сущности
      • Определение функциональной информации Function и инициализации для сбора данных о каждом бизнес-функциональном пункте (например, Action в MVC) для настройки кеширования, ведения журнала операций и управления разрешениями
      • Определение модуля разрешений Permissions
      • Реализация запуска службы внедрения зависимостей фреймворка, добавление сервисов каждого модуля в зависимости от пакета
      • Реализация ServiceLocator для разрешения зависимостей объектов
    • OSharp.EntityFrameworkCore
      • Реализация инициализации контекста времени выполнения и автоматической загрузки связанных типов сущностей
      • Реализация хранилища данных Repository
      • Реализация UnitOfWork для управления несколькими контекстами и синхронизации транзакций с одним DbConnection
      • Реализация разделения чтения и записи данных для основной и подчиненной структуры
    • OSharp.AutoMapper
      • Различные типы отображения реализуются через Profile
      • Автоматическое сканирование сборки для поиска реализаций IMapTuple интерфейса Profile для регистрации стратегии отображения
      • Определяется MapToAttribute и MapFromAttribute для маркировки Source и Target типов отображения. При использовании они помечаются как [MapTo(typeof(TTarget))] или [MapFrom(typeof(TSource))] на соответствующем типе. Во время инициализации фреймворка соответствующие типы автоматически регистрируются через CreateMap
    • OSharp.AspNetCore
      • AspNet
        • Реализован запуск фреймворка app.UseOSharp(), который вызывает Pack Manager для запуска каждого функционального модуля (OSharpPack)
        • Реализовано разрешение объектов Scoped на основе текущего запроса через ServiceLocator
        • Реализована обработка 404 для JSON запросов
        • Реализованы регистрация и запись исключений для JSON запросов в промежуточном программном обеспечении
      • MVC
        • Добавлены Api и AreaApi контроллеры
        • Реализован обработчик функциональных точек MVC
        • Реализован обработчик бизнес-модулей MVC
        • Реализован AOP для проверки разрешений на основе MVC
        • Реализован AOP для фиксации транзакций на основе MVC
      • SignalR
    • OSharp.Identity
      • Authentication
        • Реализован поставщик утверждений пользователей IUserClaimsProvider
        • Cookie
          • Реализован вход через Cookie и обновление информации о пользователях онлайн
        • JwtBearer
          • Реализовано построение токенов Jwt
          • Реализован механизм обновления токенов Jwt
        • OAuth2
          • Поддерживаются QQ, Github, MicroSoft, Google и другие сторонние системы входа, а также создание локальных пользователей и их привязка
      • Identity
        • Пользователи могут добавлять псевдонимы NickName и использовать стандартные валидаторы
        • Переписан UserStore, RoleStore с использованием существующего IRepository для хранения данных
        • Интеграция сторонних систем OAuth2 аутентификации
        • Система кэширования информации о пользователях в сети
    • OSharp.Authorization.Functions
      • Реализовано хранение разрешений для функций
      • Во время инициализации системы данные о функциях, сущностях и разрешениях ролей сохраняются в базе данных
      • В системе инициализации информация о функциях, сущностях, ролях и разрешениях кэшируется в памяти
      • Реализована проверка разрешений ролей и функций
    • OSharp.Authorization.Datas
      • Реализовано управление разрешениями для ролей и сущностей
      • Реализовано фильтрация разрешений для ролей и сущностей

Благодарности

JetBrains Resharper

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

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/i66soft-osharp.git
git@api.gitlife.ru:oschina-mirror/i66soft-osharp.git
oschina-mirror
i66soft-osharp
i66soft-osharp
master