
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