ASPNET Core MVC

  • تنفيذ مهمة مجدولة في ASP.NET Core MVC

    بالطبع، يمكنك تنفيذ مهمة مجدولة في تطبيق ASP.NET Core MVC لتشغيلها في كل يوم جديد. هذا يمكن أن يكون مفيدًا لأنواع مختلفة من المهام مثل تنظيف قاعدة البيانات، إرسال تقارير بشكل دوري، أو تحديث بيانات منتجاتك بناءً على جدول زمني. لتحقيق ذلك في ASP.NET Core MVC، يمكنك استخدام مكتبة مدير المهام المجدولة الخاصة بـ .NET Core.

    في البداية، يجب عليك تثبيت مكتبة مدير المهام المجدولة باستخدام NuGet. يمكنك فعل ذلك من خلال موجه الأوامر NuGet Package Manager Console في Visual Studio باستخدام الأمر التالي:

    mathematica
    Install-Package Microsoft.Extensions.Hosting.WindowsServices

    بمجرد تثبيت المكتبة، يمكنك إنشاء مهمة مجدولة بسهولة. هناك عدة خطوات يجب اتباعها:

    1. قم بإنشاء فئة تنفيذ المهمة، ويجب أن تنفذ واجهة IHostedService. يمكنك تسمية هذه الفئة بأي اسم تريده، على سبيل المثال DailyTaskService. في داخل هذه الفئة، ستكتب الكود الخاص بالمهمة التي تريد تنفيذها في كل يوم جديد.

    2. ثم، قم بتسجيل خدمتك في طريقة ConfigureServices في فئة Startup.cs لتتمكن من استخدامها في تطبيقك.

    3. بعد ذلك، قم بتكوين البرنامج الرئيسي (Main) للتطبيق لتسجيل خدمتك باعتبارها جزءًا من تشغيل التطبيق.

    4. وأخيرًا، قم بتكوين الخيارات الخاصة بك لتحديد وقت تشغيل المهمة المجدولة.

    سأقدم لك مثالًا على كيفية تنفيذ ذلك:

    في البداية، يمكنك إنشاء فئة تنفيذ المهمة:

    csharp
    using Microsoft.Extensions.Hosting; using System; using System.Threading; using System.Threading.Tasks; public class DailyTaskService : IHostedService, IDisposable { private Timer _timer; public Task StartAsync(CancellationToken cancellationToken) { _timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromDays(1)); return Task.CompletedTask; } private void DoWork(object state) { // يمكنك هنا وضع العمليات التي تريد تنفيذها بشكل دوري في كل يوم جديد Console.WriteLine("Running daily task..."); } public Task StopAsync(CancellationToken cancellationToken) { _timer?.Change(Timeout.Infinite, 0); return Task.CompletedTask; } public void Dispose() { _timer?.Dispose(); } }

    ثم، قم بتسجيل هذه الخدمة في Startup.cs:

    csharp
    public void ConfigureServices(IServiceCollection services) { services.AddHostedService(); }

    وأخيرًا، قم بتكوين البرنامج الرئيسي (Main) لتطبيقك:

    csharp
    public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup(); });

    هذا المثال يوضح كيفية تنفيذ مهمة مجدولة لتشغيلها في كل يوم جديد في تطبيق ASP.NET Core MVC. يمكنك تخصيص الكود بما يتناسب مع احتياجاتك الخاصة، مثل تغيير التوقيت أو إضافة المزيد من العمليات التي تريد تنفيذها في المهمة المجدولة.

    المزيد من المعلومات

    بالطبع، سنواصل الآن تكملة المقال لتوفير معلومات إضافية وتفاصيل حول تنفيذ المهمة المجدولة في تطبيق ASP.NET Core MVC.

    5. تكوين الخيارات لتحديد وقت تشغيل المهمة المجدولة:

    لتحديد وقت تشغيل المهمة المجدولة، يمكنك استخدام مكونات Microsoft.Extensions.Options لتحميل إعدادات التطبيق من مصادر مختلفة مثل JSON أو ملفات تكوين. يمكنك أيضًا تكوين الوقت المحدد لتشغيل المهمة مباشرة في كود التطبيق.

    على سبيل المثال، إذا أردت تحديد وقت تشغيل المهمة في الساعة 12:00 صباحًا بتوقيت UTC، يمكنك تحديد ذلك في طريقة StartAsync في فئة DailyTaskService كما يلي:

    csharp
    public Task StartAsync(CancellationToken cancellationToken) { // حساب الوقت المتبقي حتى الساعة 12:00 صباحًا بتوقيت UTC var now = DateTime.UtcNow; var timeUntilMidnight = DateTime.UtcNow.Date.AddDays(1) - now; _timer = new Timer(DoWork, null, timeUntilMidnight, TimeSpan.FromDays(1)); return Task.CompletedTask; }

    6. التعامل مع الاستثناءات:

    يجب أيضًا أن تكون على دراية بكيفية التعامل مع الاستثناءات في المهمة المجدولة. يفضل أن تقوم بالتعامل مع الاستثناءات داخل المهمة نفسها لتجنب تعليق التطبيق بأكمله في حال حدوث خطأ.

    يمكنك التعامل مع الاستثناءات في طريقة DoWork في فئة DailyTaskService عن طريق استخدام بيانات التجربة (try-catch) كما يلي:

    csharp
    private void DoWork(object state) { try { // العمليات التي تريد تنفيذها بشكل دوري في كل يوم جديد Console.WriteLine("Running daily task..."); } catch (Exception ex) { // التعامل مع الاستثناءات هنا، مثل تسجيل الخطأ أو إرسال إشعار بالبريد الإلكتروني Console.WriteLine($"An error occurred: {ex.Message}"); } }

    اختبار المهمة المجدولة:

    بعد كتابة وتكوين المهمة المجدولة، يُنصح بأخذ الوقت لاختبارها للتأكد من أنها تعمل كما هو متوقع. يمكنك ذلك عن طريق تشغيل التطبيق ومراقبة سجلات النظام أو إخراج الكونسول للتحقق من تنفيذ المهمة في الوقت المحدد.

    خلاصة:

    تنفيذ مهمة مجدولة في تطبيق ASP.NET Core MVC يمكن أن يكون مفيدًا للعديد من الأغراض، مثل تنظيف قاعدة البيانات، وإرسال التقارير بشكل دوري، وتحديث بيانات التطبيق. من خلال استخدام مكتبة مدير المهام المجدولة الخاصة بـ .NET Core وتكوين الخدمة المجدولة بشكل صحيح، يمكنك تنفيذ المهام بشكل فعال ومنتظم في تطبيقك ASP.NET Core MVC.

  • تعيين CreatedDate و ModifiedDate في ASP.NET Core MVC

    لتحقيق هذا المطلوب في ASP.NET Core MVC، يمكنك استخدام خاصية [DatabaseGenerated(DatabaseGeneratedOption.Computed)] لكل من CreatedDate و ModifiedDate في نموذج Passage. يُعتبر هذا الأمر إشارة لقاعدة البيانات بأنها يجب أن تقوم بتوليد القيم تلقائيًا عند إنشاء أو تعديل سجل.

    لذا، يمكن تحديث نموذج Passage ليبدو كالتالي:

    csharp
    namespace Joukyuu.Models { using System; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; public class Passage { [Key] public int PassageId { get; set; } public string Contents { get; set; } [DatabaseGenerated(DatabaseGeneratedOption.Computed)] public DateTime CreatedDate { get; set; } [DatabaseGenerated(DatabaseGeneratedOption.Computed)] public DateTime ModifiedDate { get; set; } } }

    بهذا، يجب أن تُعين Entity Framework Core تلقائيًا القيم الصحيحة لـ CreatedDate و ModifiedDate عند إنشاء أو تعديل سجل في Passage.

    المزيد من المعلومات

    بالطبع، يمكنني توضيح المزيد من المعلومات حول كيفية تحقيق هذا السيناريو في ASP.NET Core MVC.

    1. القيم الافتراضية للتواريخ: يمكنك أيضًا تعيين قيم افتراضية للتواريخ في حال لم يتم تحديدها من قبل قاعدة البيانات. للقيام بذلك، يمكنك تعديل نموذج Passage ليشمل القيم الافتراضية:

      csharp
      namespace Joukyuu.Models { using System; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; public class Passage { [Key] public int PassageId { get; set; } public string Contents { get; set; } [DatabaseGenerated(DatabaseGeneratedOption.Computed)] public DateTime CreatedDate { get; set; } = DateTime.UtcNow; [DatabaseGenerated(DatabaseGeneratedOption.Computed)] public DateTime ModifiedDate { get; set; } = DateTime.UtcNow; } }
    2. تحديث التواريخ في حالة التعديل فقط: إذا أردت تحديث ModifiedDate فقط عند تعديل السجل دون تغيير CreatedDate، فيمكنك استخدام الحدث BeforeSaveChange في context الخاص بقاعدة البيانات لتحقيق ذلك. فيمكنك إضافة الكود التالي إلى context الخاص بك:

      csharp
      public override int SaveChanges() { foreach (var entry in ChangeTracker.Entries()) { if (entry.Entity is Passage passage) { switch (entry.State) { case EntityState.Added: passage.CreatedDate = DateTime.UtcNow; passage.ModifiedDate = DateTime.UtcNow; break; case EntityState.Modified: passage.ModifiedDate = DateTime.UtcNow; break; } } } return base.SaveChanges(); }

      يتم فحص كل سجل قبل حفظ التغييرات، ويُعين ModifiedDate على DateTime.UtcNow في حالة التعديل.

    3. استخدام Timestamps بدلاً من التواريخ المحسوبة: يمكنك استخدام timestamp properties بدلاً من التواريخ المحسوبة في النموذج الخاص بك. لتحقيق ذلك، قم بتعديل نموذج Passage كالتالي:

      csharp
      namespace Joukyuu.Models { using System; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; public class Passage { [Key] public int PassageId { get; set; } public string Contents { get; set; } [Timestamp] public byte[] CreatedDate { get; set; } [Timestamp] public byte[] ModifiedDate { get; set; } } }

      في هذه الحالة، ستقوم Entity Framework Core بتحديث الـ timestamp properties تلقائيًا عندما يتم تعديل السجل.

    باستخدام أي من هذه الطرق، يجب على ASP.NET Core MVC تعيين التواريخ تلقائيًا وفقًا للسيناريو الذي وصفته.

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر