
Delphi Framework(Windows/Linux/Android/MacOSX/IOS)可以輕鬆構建高性能和可擴展台式機,移動和Web應用程序。 Delphi 10至12雅典得到了支持。
請在Github“星”這個項目!它無需花費,但有助於參考代碼。 
如果您覺得這個項目有用,請考慮捐款。
抽象:
服務:
MVC:
擴展:
MVC擴展:
更新:
QuickCore是一個容易構建桌面/移動/網絡應用程序的框架。
整個框架是基於依賴注入率的。一個容器保留了應用程序所需的所有服務,從而可以輕鬆的基礎架構與小型福特更改。
服務將自動注入服務器,並通過單個單元“啟動”配置。每個核心項目都需要一個啟動。
這是我們可以註冊預定義或自定義服務並控制其生命週期(Singleton,Transient,..)的服務集合。 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構建器來簡化配置。默認選項可以作為選項委託函數傳遞。當存在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可與選項模式一起使用。每個頂點對像都將作為配置文件中的部分保存,並可以注入服務或控制器構造函數。期權服務需要添加到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的定義,則類名將用作config文件中的截面名稱。每個配置的選項都將保存並加載到配置文件,但是如果我們願意,我們可以隱藏一些選項,從保存中。使用選項。 HideOptions:= true(對於內部選項,不可外部配置)。
調試器是一個簡單的示踪劑示威者(請參閱Quicklib文檔)。要將調試器與記錄服務連接起來,只需要在ServiceCollection中添加debugger服務(默認情況下使用控制台輸出):
services.AddDebugger;使用Commandline擴展名,使用命令行參數很容易。定義從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命令行擴展名:
services.AddCommandline<TArguments>;當您與EXE打電話時 - 螺旋 - 您會收到文檔。如果您需要檢查開關或價值,則可以這樣做:
if services.Commandline<TArguments>.Port = 0 then ...
if services.Commandline<TArguments>.Silent then ...可以將接口和實現添加到ServiceCollection中。添加子和添加傳輸允許定義實時周期。
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擴展方法,即擴展服務。
要添加擴展名,我們需要將其單元添加到啟動單元使用子句(請參閱上面的QuickCore預定義的擴展名)。
uses
Quick.Core.Extensions.AutoMapper;
...
begin
services.Extension<TAutoMapperServiceExtension>
.AddAutoMapper;
end ;使用QuickCore,我們可以使用控制器和操作創建Web應用程序。
創建一個應用程序服務器並定義綁定和安全性。
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(contranterclass):允許將控制器添加到Web應用程序服務器中。
addControllers:添加所有在其初始化單元中註冊的控制器,該單元使用registerController(ControllerClass);
UseWebroot(路徑):定義靜態文件/數據文件夾。
UseCustomErrorPages:啟用自定義錯誤頁面。在403錯誤中,服務器將搜索403.html,40x.html或4xx.html文件。如果指定了dinamic頁面,則將簡單的鬍子模式替換為錯誤信息(statuscode,statusmsg等)。
Usemustachepages:簡單的鬍子模板引擎以替換簡單的視圖。
中間Wares就像功能層,並陷入請求管道。根據中間軟件申請書,每個中間Wares(以創建順序)是否通過(按創建順序)通過。
UsestaticFiles:允許使用靜態內容。
USEHST: HTTP嚴格的運輸安全中間件,僅允許HTTPS連接。
USEHTTPSREDIRECTIONT:啟用重定向中間軟件可以重定向到找到的標題位置。
用戶路線:啟用路由中間件可以從請求獲得匹配路由。
USEMVC:啟用MVC中間件可以將每個請求管理和重定向到其通訊控制器操作或視圖。
Usemiddleware:添加自定義中間件類以請求管道。
使用(requestDelegate):執行匿名方法作為中間件。
用戶限制:嘗試從請求獲取身份驗證信息。
用戶化:允許/允許根據授權政策獲得資源的經驗。
每個控制器都從thtpcontroller繼承,並且已發布的方法成為動作。使用自定義屬性,我們可以定義這些方法的路由,授權等。由於所有控制器都從依賴項注入中註入,因此我們可以使用自動注射參數定義構造函數,而IOC將嘗試在構造函數創建上解決。
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:僅數字alpha:只有字母。浮點:僅浮數。
[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;動作結果是控制器的結果。狀態代碼(狀態代碼,statustext):將狀態代碼和可選狀態文本返回到客戶端。
Result := StatusCode( 200 , ' ok ' );確定(statustext):返回200個狀態代碼和可選的statustext。
接受(Statustext):返回202狀態代碼和可選狀態文本。
BadRequest(statustext):返回400個狀態代碼和可選狀態文本。
NOTFOUND(Statustext):返回404狀態代碼和可選狀態文本。
禁止(Statustext):返回403狀態代碼和可選狀態文本。
未經授權(Statustext):返回401狀態代碼和可選狀態文本。
重定向(URL):將時間重定向返回到URL。
重定向經歷(URL):返回一個永久性重定向到URL。
內容(文本):返迴響應文本。
JSON(Object,bysempublyProperties):返回一個序列化的JSON對像或列表。如果僅啟用了ProperedProperties,則僅將對對象發布的屬性序列化。
Result := Json(User);查看(ViewName):返回視圖。
Result := View ( ' home ' );AutoMapper擴展程序允許將類型映射到其他類類型。要使用Automapper,我們必須在Statup單元中將服務添加到SERVICOLLECTY:
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>;Formember(Source Property,TargetProperty):將源屬性名稱映射到目標屬性名稱。無知:忽略目標上的所有非現有屬性。
忽略horehothermbers:只能解決自定義映射中定義的屬性。
ResolveUnmapped:嘗試在未定義profileMap的情況下自動解析任何映射。
自動應用程序可以將其註入到使用條款中的抽象的對象/控制器中。
uses
Quick.Core.Mapping.Abstractions;
...
TMyController.Create(aMapper : IMapper);..並使用它:
product := fMapper.Map(dbproduct).AsType<TProduct>;您想學習Delphi還是提高技能? Learndelphi.org