
يساعد Coravel المطورين على تشغيل تطبيقات .NET الخاصة بهم بسرعة وتشغيلها من خلال جعل ميزات التطبيق المتقدمة مثل جدولة المهمة/الوظائف ، وقائمة الانتظار ، والتخزين المؤقت ، والبريد (وأكثر!) يمكن الوصول إليها وسهلة الاستخدام. يأتي مع بناء جملة بسيطة ومباشرة ومباشرة.
يمكنك عرض المستندات الرسمية هنا.

عادةً ما يتعين عليك تكوين مهمة CRON أو مهمة عبر Windows Task Screduler للحصول على مهام واحدة أو متعددة لإعادة التشغيل لتشغيلها.
مع Coravel ، يمكنك إعداد جميع المهام المجدولة في مكان واحد باستخدام بناء جملة بسيط وأنيق وطلاقة - في الكود!
يمنحك Coravel قائمة انتظار تكوين صفر يتم تشغيلها في الذاكرة لتفريغ المهام الطويلة إلى الخلفية بدلاً من جعل المستخدمين ينتظرون لطلب HTTP الخاص بهم!
يوفر لك Coravel واجهة برمجة تطبيقات سهلة الاستخدام للتخزين المؤقت في تطبيقات .NET Core.
بشكل افتراضي ، يستخدم ذاكرة التخزين المؤقت في الذاكرة ، ولكن لديها أيضًا برامج تشغيل لقاعدة البيانات لسيناريوهات أكثر قوة!
يساعدك بث حدث Coravel على بناء تطبيقات قابلة للصيانة والتي تقترن بشكل فضفاض!
رسائل البريد الإلكتروني ليست سهلة كما ينبغي. لحسن الحظ بالنسبة لك ، Coravel يحل هذا من خلال تقديم:
appsettings.jsonيمكنك دعم عملي المستمر مفتوح المصدر على BuyMeaCoffee.
إليك مدى سرعة استخدام Coravel للبدء في بناء عملية خدمة عمل أساسية يمكنها إصدار إجراءات على فترات جدولة:
dotnet new worker -n [NameOfYourApp] -o ./[NameOfYourApp]dotnet add package coravelProgram.cs بما يلي: using Coravel ;
Console . OutputEncoding = System . Text . Encoding . UTF8 ;
var builder = Host . CreateApplicationBuilder ( args ) ;
builder . Services . AddScheduler ( ) ;
var host = builder . Build ( ) ;
host . Services . UseScheduler ( s =>
{
s . Schedule ( ( ) => Console . WriteLine ( "It's alive! ?" ) ) . EverySecond ( ) ;
} ) ;
host . Run ( ) ;dotnet runهذا كل شيء - ترميز سعيد!
إذا كنت تقوم ببناء تطبيق .NET مع إطار الكيان ، فقد ترغب في النظر في Coravel Pro. إنها لوحة وأدوات مسؤولة لجعل الحفاظ على تطبيق .NET الخاص بك !NET!
كان Hangfire موجودًا لفترة من الوقت - قبل الحديثة .NET (جوهر). إنها أداة رائعة تحتوي على الكثير من الميزات التي لا يقوم بها Coravel. والجدير بالذكر: قوائم الانتظار المستمرة ، وآليات إعادة المحاولة ، ودعم العديد من برامج تشغيل التخزين ، إلخ.
ومع ذلك ، لا يزال Hangfire (اعتبارًا من مارس 2023) لا يدعم أصلاً من async/await (هنا وهنا). هذا يعني أن استخدام Hangfire داخل تطبيق الويب ، على سبيل المثال ، لن يكون فعالًا كما يمكن أن يكون عند استخدام مؤشرات الترابط التي تؤدي عمليات الإدخال/الإخراج.
تم إنشاء Coravel مع Primitives C# و .NET الحديثة في الاعتبار - مثل المرافق التبعية المدمجة في async/await و .NET. هذا يعني أن Coravel قد يكون من الأسهل تكوينه وسيكون فعالًا للغاية مع / لن يخطو مؤشرات الترابط التي يحتاجها تطبيق الويب الخاص بك للرد على طلبات HTTP الواردة.
الكوارتز هي مكتبة جافا أقدم تم نقلها إلى .NET. لا يزال لا يتم ربطه في أدوات حقن التبعية الحديثة. يعتقد البعض أن واجهات برمجة تطبيقات Coravel هي أكثر إيجازًا وفهمًا.
على سبيل المثال ، قارن هذه العينة من وثائقهم مع كيفية العمل مع Coravel (على سبيل المثال ، لا تحتاج إلى فهم كيفية "البدء" و "إيقاف" جدولة Coravel ، ولكن عليك العمل يدويًا مع جدولة الكوارتز).
رقم على الأقل ، ليس بعد.
Coravel عمليات قائمة الانتظار في الذاكرة. عندما ينخفض طلبك ، فلن يسمح للتطبيق بإغلاقه حتى تتم معالجة جميع العناصر.
كانت فلسفة Coravel هي العمل بشكل جيد مع Primitives .NET - مما يعني أن استخدام المكتبات الأخرى أمر سهل.
لا يدعم Coravel آليات إعادة المحاولة داخليًا لأنني حريص جدًا على عدم ارتكاب Coravel مع أشياء غير ضرورية. أريد أن أبقي Coravel يركز على ما هو أفضل (على سبيل المثال "أحتاج إلى جدولة الوظائف ، طابور ، إلخ. دون الحاجة إلى بنية تحتية إضافية وتكوين معقد").
على سبيل المثال ، يمكنك استخدام Polly داخل Invocables للقيام بإعادة المحاكاة. سيقوم بعض الأشخاص بتكوين فئة أساسية ترث من IInvocable التي تحفظها.
لا. ومع ذلك ، يمكن تحقيق ذلك مرة أخرى باستخدام مكتبة قفل موزعة تم اختبارها في المعركة مثل distributedlock. يمكنك إنشاء Invoceable's Invoke() مثل هذا:
public class TestInvocable : IInvocable
{
private ApplicationDbContext _context ;
private IDistributedLockProvider _distributedlock ;
public TestInvocable ( ApplicationDbContext context , IDistributedLockProvider distributedlock )
{
this . _context = context ;
this . _distributedlock = distributedlock ;
}
public async Task Invoke ( )
{
await using ( await this . _distributedlock . AcquireAsync ( ) )
{
await this . _context . Test . AddAsync ( new TestModel ( ) { Name = "test name" } ) ;
await this . _context . SaveChangesAsync ( ) ;
}
}
}