
Delphi Framework (Windows/Linux/Android/MacOSX/IOS) لإنشاء تطبيقات المكتب عالية الأداء وقابلة للتطوير بسهولة. دلفي من 10 إلى 12 أثينا مدعومة.
يرجى "نجمة" هذا المشروع في جيثب! لا يكلف شيئًا سوى الرجوع إلى الرمز. 
إذا وجدت هذا المشروع مفيدًا ، فيرجى التفكير في تقديم التبرع.
التجريدات:
خدمات:
MVC:
الامتدادات:
ملحقات MVC:
التحديثات:
QuickCore هو إطار عمل لسهولة بناء سطح المكتب/الجوال/الويب.
ويستند إطار عمل كامل على موازات حقن التبعية. تحتوي الحاوية على جميع الخدمات التي يحتاجها التطبيق ، مما يتيح تغييرات في البنية التحتية السهلة مع مواد طفيفة.
يتم حقن الخدمات تلقائيًا في الخادم وتكوينها من وحدة واحدة "بدء التشغيل". يحتاج كل مشروع أساسي إلى بدء تشغيل. pas مع فصل وراثي من tstartupBase (انظر أمثلة على مجلد العينات).
إنها مجموعة من الخدمات حيث يمكننا تسجيل خدمات محددة مسبقًا أو مخصصة والتحكم في دورة حياتها (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 يعمل مع نمط الخيارات. سيتم حفظ كل كائن Toptions كقسم في ملف التكوين ويمكن حقنه في خدمات الخدمات أو وحدات التحكم. يجب أن تضاف خدمة الخيارات إلى 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".
إذا لم يكن خيارًا. يتم تعريف اسم الفئة ، سيتم استخدام اسم الفصل كاسم قسم في ملف التكوين. سيتم حفظ كل خيار تم تكوينه وتحميله إلى ملف التكوين ، ولكن إذا أردنا ذلك ، فيمكننا إخفاء بعض الخيارات من حفظها. استخدم الخيارات.
Debugger هو تتبع بسيط (انظر وثائق 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 ;وانتشر إلى تمديد خط الأوامر:
services.AddCommandline<TArguments>;عندما تتصل بـ exe الخاص بك مع -help تحصل على الوثائق. إذا كنت بحاجة إلى التحقق من وجود مفتاح أو قيمة ، فيمكنك القيام بذلك:
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 Extensions Sephered Sephered).
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 (ControlerClass): السماح بإضافة وحدة تحكم إلى خادم تطبيق ويب.
AddControllers: أضف جميع وحدات التحكم المسجلة أثناء وحدة التهيئة الخاصة بها مع RegisterController (ControlerClass) ؛
UseWebroot (PATH): تحديد ملفات/مجلد البيانات الثابتة.
UseCustOmerRorpages: تمكين استخدام صفحات الأخطاء المخصصة. على خطأ 403 ، سيبحث الخادم عن ملفات 403.html أو 40x.html أو 4xx.html. إذا تم تحديد صفحة الديناميك ، فسيتم استبدال أنماط الشارب البسيطة بمعلومات الخطأ (statusCode ، statusMSG ، إلخ).
USEMUSTACHEPAGES: محرك قالب شارب بسيط لاستبدال طرق العرض البسيطة.
تشبه الأوساط الوسطى طبقات من الوظائف وتدخل خط أنابيب طلب. كل طلب تمريرة لكل middlwares (في ترتيب الإنشاء) أو لا ، اعتمادًا على طلبات middelware.
UsestaticFiles: للسماح بخدمة المحتوى الثابت.
useHSTS: HTTP Strict Transport Security Manidware للسماح فقط اتصالات HTTPS.
useHttpSredirection: يتيح إعادة توجيه الوسيطة من إعادة التوجيه على موقع الرأس الموجود.
الاستخدام: تمكين توجيه الوسيطة من الحصول على مسار مطابقة من الطلب.
USEMVC: تمكين MVC الوسيطة من إدارة وإعادة توجيه كل طلب إلى إجراء مراسلة مراسلة أو عرض.
UseMiddleware: لإضافة فئة مودعة مخصصة لطلب خط أنابيب.
استخدم (requestDelegate): قم بتنفيذ طريقة مجهولة كموادي.
useaUffication: يحاول الحصول على معلومات المصادقة من طلب.
useauunization: السماح/عدم السماح بالموارد القائمة على سياسات التفويض.
ترث كل وحدة تحكم من thttpcontroller وتصبح الأساليب المنشورة إجراءات. مع سمات مخصصة ، يمكننا تحديد التوجيه ، والترخيص ، وما إلى ذلك. نظرًا لأن جميع وحدات التحكم يتم حقنها من حقن التبعية ، فيمكننا تحديد المُنشئ مع المعلمات القابلة للتطبيق وسيحاول 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: رقمي فقط ألفا: الحروف فقط. تعويم: أرقام عائمة فقط.
[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 ' );موافق (Statustext): إرجاع رمز الحالة 200 و statustext اختياري.
مقبول (Statustext): إرجاع رمز الحالة 202 ونص الحالة الاختيارية.
BadRequest (Statustext): إرجاع رمز الحالة 400 ونص الحالة الاختيارية.
Notfound (Statustext): إرجاع رمز الحالة 404 ونص الحالة الاختيارية.
لا سمح (Statustext): إرجاع رمز الحالة 403 ونص الحالة الاختيارية.
غير مصرح به (Statustext): إرجاع رمز الحالة 401 ونص الحالة الاختيارية.
إعادة التوجيه (URL): إرجاع إعادة توجيه زمني إلى URL.
إعادة التوجيه (URL): إرجاع إعادة توجيه دائم إلى عنوان URL.
المحتوى (النص): إرجاع نص الاستجابة.
JSON (Object ، OnlyPublishedProperties): إرجاع كائن أو قائمة متسلسلة JSON. إذا تم تمكين فقط publichedProperties ، فسيتم تسلسل الخصائص المنشورة فقط.
Result := Json(User);عرض (ViewName): إرجاع عرض.
Result := View ( ' home ' );يتيح ملحق السيارات خريطة نوع فئة إلى نوع فئة آخر. لاستخدام السيارات ، يجب أن نضيف خدمة إلى ServiceCollection في وحدة STATUP:
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 (SourceProperty ، TargetProperty): تعيين اسم خاصية مصدر إلى اسم خاصية الهدف. agnoreallnonexisting: تجاهل جميع الخصائص غير الموجودة على الهدف.
تجاهل الأعضاء: سيتم حل الخصائص المحددة فقط في رسم الخرائط المخصصة.
ResolveUnmed: يحاول حل أي خريطة تلقائيًا دون تعريف profilemap.
يمكن حقن خدمة السيارات في كائن/وحدة تحكم يحدد التجريد في استخدام الجمل.
uses
Quick.Core.Mapping.Abstractions;
...
TMyController.Create(aMapper : IMapper);.. واستخدامه:
product := fMapper.Map(dbproduct).AsType<TProduct>;هل تريد تعلم دلفي أو تحسين مهاراتك؟ LearnDelphi.org