
Delphi Framework (Windows/Linux/Android/MacOSX/IOS) untuk membangun aplikasi desktop, seluler, dan web yang dapat diukur dengan kinerja tinggi dan terukur dengan mudah. Delphi 10 hingga 12 Athena didukung.
Tolong "Bintang" proyek ini di GitHub! Tidak ada biaya apa pun selain membantu merujuk kode. 
Jika Anda menemukan proyek ini bermanfaat, pertimbangkan untuk memberikan sumbangan.
Abstraksi:
Layanan:
MVC:
Ekstensi:
Ekstensi MVC:
Pembaruan:
QuickCore adalah kerangka kerja untuk membangun aplikasi desktop/seluler/web yang mudah.
Seluruh kerangka kerja didasarkan pada prinsip injeksi ketergantungan. Wadah memegang semua layanan yang dibutuhkan oleh aplikasi, memungkinkan perubahan infrastruktur yang mudah dengan interkor kecil.
Layanan secara otomatis disuntikkan ke server dan dikonfigurasi dari satu unit "startup". Setiap proyek inti membutuhkan startup.pas dengan kelas yang mewarisi dari TStartupBase (lihat contoh pada folder sampel).
Ini adalah kumpulan layanan di mana kami dapat mendaftarkan layanan yang telah ditentukan atau kustom dan mengendalikan siklus hidupnya (Singleton, Transient, ..). ServiceCollection adalah wadah build-in yang termasuk dalam QuickCore dan mendukung injeksi konstruktor secara default.
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 bekerja dengan antarmuka ilogger. Kami dapat menggunakan ekstensi logging build-in atau menentukan implementasi sendiri dan menyuntikkannya.
Untuk menggunakan implementasi QuickLogger (membutuhkan Perpustakaan QuickLogger. Lihat Persyaratan Instalasi). QuickLogger menggunakan pembangun ilogger untuk konfigurasi yang mudah. Opsi default dapat dilewati sebagai fungsi delegasi opsi. Saat file konfigurasi QuickLogger ada, tidak ada opsi default yang akan diterapkan lebih banyak:
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
);... atau tambahkan implementasi logger sendiri
services.AddLogging(MyLogger);File konfigurasi logging QuickCore disimpan sebagai file quicklogger.yml o json. Menggunakan variabel lingkungan core_environment kita dapat menentukan file apa yang digunakan untuk setiap implementasi. Jika variabel lingkungan didefinisikan, QuickCore akan mencoba memuat/menyimpan "QuickCore. [Core_environment] .yaml/json" file.
QuickCore bekerja dengan pola opsi. Setiap objek toptions akan disimpan sebagai bagian dalam file konfigurasi dan dapat disuntikkan ke layanan atau pengontrol konstruktor. Layanan Opsi perlu ditambahkan ke serviceCollection sebelum kita dapat menambahkan bagian. Kami dapat mendefinisikan nama file konfigurasi dan format JSON atau YAML.
.AddOptions(TOptionsFileFormat.ofYAML,True)Setiap bagian konfigurasi perlu ditambahkan, dan dapat dikonfigurasi dengan nilai default.
services.Configure<TAppSettings>(procedure(aOptions : TAppSettings)
begin
aOptions.Smtp := ' mail.domain.com ' ;
aOptions.Email := ' [email protected] ' ;
end )
Dan kita dapat menyuntikkannya nanti sesederhana ...
constructor TMyController.Create(aLogger : ILogger; aAppSettings : IOptions<TAppSettings>);
begin
fOptions := aAppSettings. Value ;
fSMTPServer.Host := fOptions.Smtp;
end ;Ke konfigurasi startup Anda dapat menggunakan opsi baca untuk melakukan beberapa tindakan opsional:
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 ;Menggunakan Variabel Lingkungan Core_environment Kami dapat menentukan file apa yang digunakan untuk setiap implementasi. Jika variabel lingkungan didefinisikan, QuickCore akan mencoba memuat/menyimpan "QuickCore. [Core_environment] .yaml" file.
Jika tidak opsi.name didefinisikan, nama kelas akan digunakan sebagai nama bagian dalam file konfigurasi. Setiap opsi yang dikonfigurasi akan disimpan dan dimuat ke file konfigurasi, tetapi jika kita mau, kita dapat menyembunyikan beberapa opsi dari disimpan. Gunakan opsi.hideoptions: = true (untuk opsi internal yang tidak dapat dikonfigurasi secara eksternal).
Debugger adalah pelacak debugger sederhana (lihat dokumentasi QuickLib). Untuk menghubungkan debugger dengan layanan logging hanya perlu menambahkan layanan debugger di serviceCollection (secara default menggunakan output konsol):
services.AddDebugger;Bekerja dengan parameter CommandLine akan mudah menggunakan ekstensi CommandLine. Tentukan kelas yang diwarisi dari TParameter atau TserviceParameter (jika bekerja dengan QuickAppServices) dengan kemungkinan argumen Anda:
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 ;Dan lulus ke ekstensi de commandline:
services.AddCommandline<TArguments>;Saat Anda menghubungi EXE Anda dengan -membantu Anda mendapatkan dokumentasi. Jika Anda perlu memeriksa sakelar atau nilai, Anda dapat melakukannya seperti ini:
if services.Commandline<TArguments>.Port = 0 then ...
if services.Commandline<TArguments>.Silent then ...Antarmuka dan implementasi dapat ditambahkan ke ServiceCollection. Addsingleton dan addTransient memungkinkan menentukan siklus hidup.
services.AddSingleton<IMyService,TMyService>;atau dengan kreasi yang didelegasikan
services.AddTransient<IMyService,TMyService>(function : TMyService)
begin
Result := TMyService.Create(myparam);
Result.Host := ' localhost ' ;
end );atau tambahkan implementasi
services.AddSingleton<TMyService>;Ekstensi adalah layanan yang dapat disuntikkan yang dapat kami tambahkan ke aplikasi/server kami. Ekstensi disuntikkan ke unit startup serviceCollection. Ekstensi metode serviceCollection berfungsi mirip dengan metode ekstensi .NET, memperluas serviceCollection.
Untuk menambahkan ekstensi, kita perlu menambahkan unitnya ke unit startup menggunakan klausa (lihat ekstensi yang telah ditentukan sebelumnya di atas).
uses
Quick.Core.Extensions.AutoMapper;
...
begin
services.Extension<TAutoMapperServiceExtension>
.AddAutoMapper;
end ;Dengan QuickCore kami dapat membuat aplikasi web dengan pengontrol dan tindakan.
Buat server aplikasi dan tentukan pengikatan dan keamanan.
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 (ControllerClass): Izinkan Tambahkan Pengontrol ke Server Aplikasi Web.
AddControllers: Tambahkan semua pengontrol yang terdaftar selama unit inisialisasi dengan registercontroller (ControllerClass);
Usewebroot (PATH): Tentukan file statis/folder data.
Usecustomerrorpages: Aktifkan penggunaan halaman kesalahan khusus. Pada kesalahan 403, server akan mencari file 403.html, 40x.html atau 4xx.html. Jika halaman dinamic ditentukan, pola kumis sederhana akan diganti dengan info kesalahan (StatusCode, StatusMSG, dll).
UseMustAChepages: Mesin template kumis sederhana untuk menggantikan tampilan sederhana.
Middleware seperti lapisan fungsionalitas dan berjalan ke dalam pipa permintaan. Setiap permintaan pass untuk setiap middlwares (dalam urutan penciptaan) atau tidak, tergantung permintaan middelware.
UsestaticFiles: Untuk memungkinkan konten statis.
Penggunaan: HTTP Middleware Keamanan Transportasi yang ketat untuk hanya mengizinkan koneksi HTTPS.
UseHttpsRedirection: Memungkinkan middleware pengalihan untuk mengarahkan kembali pada lokasi header yang ditemukan.
Pengguna: Mengaktifkan Routing Middleware untuk mendapatkan rute yang cocok dari permintaan.
USEMVC: Aktifkan MVC Middleware untuk mengelola dan mengarahkan setiap permintaan ke tindakan atau tampilan pengontrol korespondennya.
USEMIDDLEWARE: Untuk menambahkan kelas middleware khusus untuk meminta pipa.
Gunakan (RequestDelegate): Jalankan metode anonim sebagai middleware.
UseAuthentication: Mencoba mendapatkan info otentikasi dari permintaan.
Useauthorization: Izinkan/larang akses ke sumber daya berdasarkan kebijakan otorisasi.
Setiap pengontrol diwariskan dari THTPController dan metode yang diterbitkan menjadi tindakan. Dengan atribut khusus kami dapat mendefinisikan perutean, otorisasi, dll dari metode ini. Karena semua pengontrol disuntikkan dari injeksi ketergantungan, kami dapat mendefinisikan konstruktor dengan parameter AutoInjectable dan IOC akan mencoba menyelesaikan pada pembuatan konstruktor.
constructor THomeController.Create(aLogger: ILogger);Routing HTTP berbasis atribut khusus. Kita perlu mendefinisikan perutean untuk setiap pengontrol dan metode/tindakan.
[HttpGet( ' home/index ' )]
function THomeController.Index : IActionResult;
[HttpPost( ' home/GetAll ' )]
function THomeController.GetAll : IActionResult;Jika routing didefinisikan pada kelas, maka itu global dan tidak perlu direplikasi pada setiap metode/tindakan:
[Route( ' home/other ' )]
THomeController = class (THttpController)
published
[HttpPost( ' GetAll ' )] // global + local = home/other/GetAll
function THomeController.GetAll : IActionResult;Parameter didefinisikan dengan atribut dan secara otomatis diuraikan dan disuntikkan sebagai parameter metode.
[HttpGet( ' Add/{productname}/{price} ' )]
function Add ( const ProductName : string; Price : Integer): IActionResult;Parameter dapat diketik ditentukan. Int: numeric Only Alpha: Hanya huruf. Float: Hanya nomor mengambang.
[HttpGet( ' Add/{productname:alpha}/{price:float} ' )]
function Add ( const ProductName : string; Price : Extended): IActionResult;Sebuah ? Tentukan parameter sebagai opsional
[HttpGet( ' Add/{productname:alpha}/{price:float?} ' )]
function Add ( const ProductName : string; Price : Extended): IActionResult;Untuk mendapatkan parameter dari Badan Permintaan (dengan deserialisasi otomatis)
[HttpPost( ' Add/User ' )]
function Add ([FromBody] User : TUser): IActionResult;Hasil tindakan adalah hasil dari pengontrol. StatusCode (StatusCode, Statustext): Mengembalikan kode status dan teks status opsional ke klien.
Result := StatusCode( 200 , ' ok ' );OK (Statustext): Mengembalikan kode status 200 dan Statustext Opsional.
Diterima (Statustext): Mengembalikan kode status 202 dan teks status opsional.
BadRequest (Statustext): Mengembalikan kode status 400 dan teks status opsional.
NOTFOUND (Statustext): Mengembalikan kode status 404 dan teks status opsional.
Forbid (Statustext): Mengembalikan kode status 403 dan teks status opsional.
Tidak sah (statustext): Mengembalikan kode status 401 dan teks status opsional.
Redirect (URL): Mengembalikan pengalihan temporal ke URL.
RedirectperMament (URL): Mengembalikan pengalihan permanen ke URL.
Konten (Teks): Mengembalikan teks respons.
JSON (Objek, OnlyPublishedProperties): Mengembalikan objek atau daftar JSON serial. Jika hanya diterbitkan diaktifkan, hanya objek yang diterbitkan properti yang akan diserialisasi.
Result := Json(User);Lihat (nama view): Mengembalikan tampilan.
Result := View ( ' home ' );Ekstensi Automapper memungkinkan memetakan jenis kelas ke jenis kelas lain. Untuk menggunakan Automapper kita harus menambahkan layanan ke serviceCollection di Unit Statup:
services.Extension<TAutoMapperServiceExtension>
.AddAutoMapper;Kemudian tentukan peta profil dengan hubungan pemetaan. Jika nama properti identik, kita tidak harus secara manual menyediakan pemetaan:
constructor TMyProfile.Create;
begin
// maps properties with same name in both classes
CreateMap<TDBUser,TUser>();
end ;
initialization
TAutoMapper.RegisterProfile<TMyProfile>;Jika beberapa properti memiliki nama atau jenis yang berbeda, kita harus menggunakan pemetaan khusus:
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 (SourceProperty, TargetProperty): Memetakan nama properti sumber ke nama properti target. IgnoreAllnonexisting: Abaikan semua properti yang tidak ada pada target.
Impanothermembers: Hanya properti yang ditentukan dalam pemetaan khusus yang akan diselesaikan.
ResolveUnmapped: mencoba menyelesaikan secara otomatis peta apa pun tanpa profilemap yang ditentukan.
Layanan Automapper dapat disuntikkan ke objek/pengontrol yang mendefinisikan abstraksi dalam penggunaan klausa.
uses
Quick.Core.Mapping.Abstractions;
...
TMyController.Create(aMapper : IMapper);..dan gunakan:
product := fMapper.Map(dbproduct).AsType<TProduct>;Apakah Anda ingin belajar Delphi atau meningkatkan keterampilan Anda? learndelphi.org