
Delphi Framework (Windows/Linux/Android/Macosx/iOS) для создания высокопроизводительных и масштабируемых рабочих столов, мобильных и веб-приложений легко. Delphi 10-12 Афины поддерживают.
Пожалуйста, «звезда» этот проект в GitHub! Это ничего не стоит, кроме как помогает ссылаться на код. 
Если вы найдете этот проект полезным, пожалуйста, рассмотрите возможность сделать пожертвование.
Абстракции:
Услуги:
MVC:
Расширения:
МЕДЕНИЯ MVC:
Обновления:
QuickCore - это структура для простого настольного компьютера/мобильных/веб -приложений.
Вся структура основана на инъекциях зависимости. Контейнер содержит все услуги, необходимые для приложения, что позволяет простым изменениям инфраструктуры с незначительным общением.
Услуги автоматически вводят в сервер и настроены с одного блока «запуска». Каждый основной проект нуждается в запуске. PAS с унаследованием класса от TStartupbase (см. Примеры в папке образцов).
Это коллекция услуг, где мы можем зарегистрировать предопределенные или пользовательские службы и контролировать его жизненный цикл (Singleton, Transiet, ..). ServiceCollection-это встроенный контейнер, включенный в QuickCore, и по умолчанию поддерживает инъекцию конструктора.
services
.AddLogging(TLoggerBuilder.GetBuilder(TLoggerOptionsFormat.ofYAML,False)
.AddConsole(procedure(aOptions : TConsoleLoggerOptions)
begin
aOptions.LogLevel := LOG_DEBUG;
aOptions.ShowEventColors := True;
aOptions.ShowTimeStamp := True;
aOptions.ShowEventType := False;
aOptions.Enabled := True;
end )
.AddFile(procedure(aOptions : TFileLoggerOptions)
begin
aOptions.FileName := ' .WebApiServer.log ' ;
aOptions.MaxFileSizeInMB := 200 ;
aOptions.Enabled := True;
end )
.Build
)
.AddDebugger
.AddOptions(TOptionsFileFormat.ofYAML,True)
// add entity database
.Extension<TEntityServiceExtension>
.AddDBContext<TShopContext>(TDBContextOptionsBuilder.GetBuilder.UseSQLite.ConnectionStringName( ' ShopContext ' ).Options)
// add Identity
.Extension<TAuthenticationServiceExtension>()
.AddIdentity<TUser,TRole>(procedure(aOptions : TIdentityOptions)
begin
aOptions.Password.RequiredLength := 6 ;
aOptions.User.RequireUniqueEmail := True;
end )
.AddEntityStore<TShopContext>();
// add Authentication
services.Extension<TAuthenticationServiceExtension>()
.AddAuthentication(procedure(aOptions : TAuthenticationOptions)
begin
end );
// add ApiKey Authentication
services.Extension<TApiKeyAuthenticationServiceExtension>
.AddApiKey()
.UseIdentityStore<TUser,TRole>( ' ApiKey ' );
// add Authorization
services.Extension<TAuthorizationServiceExtension>
.AddAuthorization(procedure(aOptions : TAuthorizationOptions)
begin
aOptions.AddPolicy( ' ApiKeyValidation ' ,TAuthorizationPolicyBuilder.GetBuilder
.RequireAuthenticatedUser.Build
// .RequireClaim(TClaimTypes.Role,'Admin').Build
);
end );QuickCore работает с интерфейсом ilogger. Мы можем использовать встроенное расширение журнала или определить собственную реализацию и ввести ее.
Для использования реализации QuickLogger (требует библиотеки QuickLogger. См. Требования к установке). QuickLogger использует конфигурацию Ilogger для простой конфигурации. Параметры по умолчанию могут быть переданы в качестве функции Delegate Options. Когда существует файл конфигурации QuickLogger, параметры по умолчанию не будут применены больше:
services
.AddLogging(TLoggerBuilder.GetBuilder(TLoggerOptionsFormat.ofYAML,False)
.AddConsole(procedure(aOptions : TConsoleLoggerOptions)
begin
aOptions.LogLevel := LOG_DEBUG;
aOptions.ShowEventColors := True;
aOptions.ShowTimeStamp := True;
aOptions.ShowEventType := False;
aOptions.Enabled := True;
end )
.AddFile(procedure(aOptions : TFileLoggerOptions)
begin
aOptions.FileName := ' .WebApiServer.log ' ;
aOptions.MaxFileSizeInMB := 200 ;
aOptions.Enabled := True;
end )
.Build
);... или добавить собственную реализацию регистрации
services.AddLogging(MyLogger);Файл конфигурации QuickCore журнала сохраняется как файл QuickLogger.yml O JSON. Используя переменную среды Core_environment, мы можем определить, какой файл использует для каждой реализации. Если переменная среды определена, QuickCore попытается загрузить/сохранить файл "QuickCore. [Core_environment] .yaml/json".
QuickCore работает с шаблоном параметров. Каждый объект Toptions будет сохранен как раздел в файле конфигурации и может быть введен в конструкторы Services или Controllers. Сервис опций должен добавить в ServiceCollection, прежде чем мы сможем добавить разделы. Мы можем определить имя файла конфигурации и формат JSON или YAML.
.AddOptions(TOptionsFileFormat.ofYAML,True)Каждый раздел конфигурации должен быть добавлен и может быть настроен со значениями по умолчанию.
services.Configure<TAppSettings>(procedure(aOptions : TAppSettings)
begin
aOptions.Smtp := ' mail.domain.com ' ;
aOptions.Email := ' [email protected] ' ;
end )
И мы можем внедрить его позже так же просто, как ...
constructor TMyController.Create(aLogger : ILogger; aAppSettings : IOptions<TAppSettings>);
begin
fOptions := aAppSettings. Value ;
fSMTPServer.Host := fOptions.Smtp;
end ;В конфигурации стартапа вы можете использовать параметры чтения для выполнения дополнительных действий:
if services.GetConfiguration<TAppSettings>.UseCache then
begin
// do some stuff or define service implementation
end
else
begin
// do some stuff or define alternative service implementation
end ;Используя переменную среды Core_environment, мы можем определить, какой файл использует для каждой реализации. Если переменная среды определена, QuickCore попытается загрузить/сохранить файл "QuickCore. [Core_environment] .yaml".
Если нет Options.name определено, имя класса будет использоваться в качестве имени раздела в файле конфигурации. Каждая настроенная опция будет сохранена и загружается в файл конфигурации, но если мы хотим, мы можем скрыть некоторые параметры от сохранения. Используйте опции.
Отладчик-это простой трасс-дебуггер (см. Документацию Quicklib). Для подключения отладчика с службой журнала необходимо добавить услугу отладчика в ServiceCollection (по умолчанию использует вывод консоли):
services.AddDebugger;Работа с параметрами командных линий будет легко с помощью расширения командной линии. Определите класс, унаследованный от Tparameters или TserviceParameters (при работе с QuickAppServices) с вашими возможными аргументами:
uses
Quick.Parameters;
type
TArguments = class (TParameters)
private
fPort : Integer;
fSilent : Boolean;
published
[ParamCommand( 1 )]
[ParamHelp( ' Define listen port ' , ' port ' )]
property Port : Integer read fPort write fPort;
property Silent : Boolean read fSilent write fSilent;
end ;И передать DE Commandline Extension:
services.AddCommandline<TArguments>;Когда вы звоните в свой exe с -вы получите документацию. Если вам нужно проверить на переключатель или значение, вы можете сделать это:
if services.Commandline<TArguments>.Port = 0 then ...
if services.Commandline<TArguments>.Silent then ...Интерфейсы и реализации могут быть добавлены в ServiceCollection. Addsingleton и AddTransient позволяют определить живой цикл.
services.AddSingleton<IMyService,TMyService>;или с делегированным творением
services.AddTransient<IMyService,TMyService>(function : TMyService)
begin
Result := TMyService.Create(myparam);
Result.Host := ' localhost ' ;
end );или добавить реализацию
services.AddSingleton<TMyService>;Расширения являются инъекционными службами, которые мы можем добавить в наше приложение/сервер. Расширения вводится в блок запуска ServiceCollection. Расширение метода ServiceCollection работает аналогично методам расширения .NET, расширению ServiceCollection.
Чтобы добавить расширение, нам необходимо добавить его блок в запуск. Использует пункт (см. QuickCore предопределенные расширения выше).
uses
Quick.Core.Extensions.AutoMapper;
...
begin
services.Extension<TAutoMapperServiceExtension>
.AddAutoMapper;
end ;С QuickCore мы можем создавать веб -приложения с контроллерами и действиями.
Создайте сервер приложений и определите привязку и безопасность.
ApiServer := TMvcServer.Create( ' 127.0.0.1 ' , 8080 ,False);
ApiServer.UseStartup<TStartup>;
ApiServer.Start;
```delphi
To configure services and middlewares startup must configured
```delphi
class procedure TStartup.Configure (app : TMVCServer);
begin
app
.AddControllers
.AddController(THomeController)
.DefaultRoute(THomeController, ' Home/Index ' )
.UseWebRoot( ' .wwwroot ' )
.UseRouting
.UseMVC;
end ;AddController (ControlClass): разрешите добавить контроллер на сервер веб -приложений.
AddControllers: добавьте все контроллеры, зарегистрированные во время его блока инициализации с помощью RegisterController (ControlClass);
Использование WhebRoot (PATH): Определите статические файлы/папку данных.
UseCustomerrorpages: включить использование пользовательских страниц ошибок. При ошибке 403 сервер будет искать файлы 403.html, 40x.html или 4xx.html. Если указана Dinamic Page, простые шаблоны усов будут заменены информацией об ошибке (StatusCode, StatusMSG и т. Д.).
USEMUSTACHEPAGES: Простой шаблонный двигатель для усов для замены простых видов.
Middlewares подобны слоям функциональности и сталкиваются с конвейером запроса. Каждый запрос проходит для каждого среднего уровня (в порядке создания) или нет, в зависимости от получения средних программ.
Usestaticfiles: чтобы позволить служить статическому содержанию.
USEHSTS: HTTP строгое промежуточное программное обеспечение для транспортной безопасности позволяет только HTTPS -соединения.
USEHTTPSREDEECTION: Позволяет перенаправить промежуточное программное обеспечение для перенаправления на местоположении заголовка.
Пользовательский разум: позволяет маршрутизации промежуточного программного обеспечения получить маршрут сопоставления от запроса.
USEMVC: Включите промежуточное программное обеспечение MVC для управления и перенаправления каждого запроса на действие или представление корреспондента.
Usemiddleware: чтобы добавить пользовательский класс промежуточного программного обеспечения для запроса трубопровода.
Использовать (requestDelegate): выполнить анонимный метод в качестве промежуточного программного обеспечения.
Useauthentication: пытается получить информацию о аутентификации из запроса.
Useauthorization: разрешить/запретить ресурсы на основе политик авторизации.
Каждый контроллер наследует от THTTPController и опубликованные методы, становится действиями. С помощью пользовательских атрибутов мы можем определить маршрутизацию, авторизацию и т. Д. Об этих методах. Поскольку все контроллеры вводят из инъекции зависимостей, мы можем определить конструктор с автоинъектируемыми параметрами, и МОК попытается разрешить создание конструктора.
constructor THomeController.Create(aLogger: ILogger);Маршрутизация HTTP основана на пользовательских атрибутах. Нам нужно определить маршрутизацию для каждого контроллера и метода/действия.
[HttpGet( ' home/index ' )]
function THomeController.Index : IActionResult;
[HttpPost( ' home/GetAll ' )]
function THomeController.GetAll : IActionResult;Если маршрутизация определена на классе, то она глобальная и не должна быть воспроизведена на каждом методе/действии:
[Route( ' home/other ' )]
THomeController = class (THttpController)
published
[HttpPost( ' GetAll ' )] // global + local = home/other/GetAll
function THomeController.GetAll : IActionResult;Параметры определяются с помощью атрибутов и автоматически проанализируются и вводится как параметры метода.
[HttpGet( ' Add/{productname}/{price} ' )]
function Add ( const ProductName : string; Price : Integer): IActionResult;Параметры могут быть напечатаны определены. Int: числовая только альфа: только буквы. Float: только плавучие числа.
[HttpGet( ' Add/{productname:alpha}/{price:float} ' )]
function Add ( const ProductName : string; Price : Extended): IActionResult;Ан? определить параметр как необязательный
[HttpGet( ' Add/{productname:alpha}/{price:float?} ' )]
function Add ( const ProductName : string; Price : Extended): IActionResult;Чтобы получить параметр от корпуса запроса (с автоматической пустыней)
[HttpPost( ' Add/User ' )]
function Add ([FromBody] User : TUser): IActionResult;Результаты действия являются результатами контроллера. StatusCode (StatusCode, Statustext): возвращает код состояния и необязательный текст состояния клиенту.
Result := StatusCode( 200 , ' ok ' );OK (STATUSTEXT): возвращает код статуса 200 и необязательный STATUSTEXT.
Принято (STATUSTEXT): возвращает код состояния 202 и необязательный текст статуса.
Badrequest (Statustext): возвращает код состояния 400 и необязательный текст состояния.
NotFound (Statustext): возвращает код состояния 404 и необязательный текст состояния.
Запрет (Statustext): возвращает код состояния 403 и необязательный текст состояния.
Несанкционированный (Statustext): возвращает код состояния 401 и необязательный текст состояния.
Перенаправление (URL): возвращает временное перенаправление на URL.
Redirectpermament (URL): возвращает постоянное перенаправление в URL.
Контент (текст): возвращает текст ответа.
JSON (Object, OnlyPublishedProperties): возвращает сериализованный объект или список JSON. Если включено только опубликованные программы, то только опубликованные объекты будут сериализованы.
Result := Json(User);View (ViewName): возвращает представление.
Result := View ( ' home ' );Automapper Extension позволяет карту типа класса к другому типу класса. Чтобы использовать Automapper, мы должны добавить услуги в ServiceCollection в блоке Statuup:
services.Extension<TAutoMapperServiceExtension>
.AddAutoMapper;Затем определите карты профилей с помощью отношения со картинами. Если имена свойств идентичны, нам не нужно вручную предоставлять отображение:
constructor TMyProfile.Create;
begin
// maps properties with same name in both classes
CreateMap<TDBUser,TUser>();
end ;
initialization
TAutoMapper.RegisterProfile<TMyProfile>;Если некоторые свойства имеют различное имя или тип, мы должны использовать пользовательские отображения:
constructor TMyProfile.Create;
begin
// maps properties with delegate function and rest maps formember
CreateMap<TDBProduct,TProduct>(procedure(src : TDBProduct; tgt : TProduct)
begin
tgt.Id := src.uid;
tgt.Age := src.Age;
end )
.ForMember( ' Money ' , ' Cash ' )
.ForMember( ' Name ' , ' FullName ' )
.IgnoreOtherMembers;
end ;
initialization
TAutoMapper.RegisterProfile<TMyProfile>;Форматив (SourceProperty, TargetProperty): отображает имя свойства источника на целевое имя свойства. Игнориальнонингвинг: игнорируйте все не существующие свойства на цель.
Игнористые игроки: только свойства, определенные в пользовательском картировании, будут разрешены.
ResolveUnmapped: пытается автоматически разрешить любую карту без определенной профилемапы.
Сервис Automapper может быть введена в объект/контроллер, определяющий абстракцию в использовании положений.
uses
Quick.Core.Mapping.Abstractions;
...
TMyController.Create(aMapper : IMapper);.. и используйте его:
product := fMapper.Map(dbproduct).AsType<TProduct>;Вы хотите изучить Delphi или улучшить свои навыки? LearnDelphi.org