
Coravel ช่วยให้นักพัฒนาได้รับแอปพลิเคชัน. NET และทำงานได้อย่างรวดเร็วโดยการสร้างคุณสมบัติแอปพลิเคชันขั้นสูงเช่น การกำหนดเวลางาน/งานการเข้าคิวการแคชการส่งจดหมาย (และอีกมากมาย!) เข้าถึงได้และใช้งานง่าย มาพร้อมกับไวยากรณ์ที่เรียบง่ายแสดงออกและตรงไปตรงมา
คุณสามารถดูเอกสารอย่างเป็นทางการได้ที่นี่

โดยปกติคุณต้องกำหนดค่างาน cron หรืองานผ่าน Windows Task Scheduler เพื่อรับงานที่เกิดขึ้นอีกครั้งหรือหลายครั้งที่จะทำงาน
ด้วย Coravel คุณสามารถตั้งค่างานที่กำหนดไว้ทั้งหมดของคุณในที่เดียวโดยใช้ไวยากรณ์ที่เรียบง่ายสง่างามและคล่องแคล่ว - ในรหัส!
Coravel ให้คิวการกำหนดค่าเป็นศูนย์ที่คุณทำงานในหน่วยความจำเพื่อลดงานที่ยืดยาวไปยังพื้นหลังแทนที่จะทำให้ผู้ใช้ของคุณรอคำขอ HTTP ของพวกเขาเสร็จสิ้น!
Coravel ให้ API ที่ใช้งานง่ายสำหรับการแคชในแอปพลิเคชัน. 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 ของคุณเป็นเรื่องง่าย!
Hangfire ได้รับการพิจารณามาระยะหนึ่งแล้ว - ก่อนที่ Modern .NET (Core) มันเป็นเครื่องมือที่ยอดเยี่ยมที่มีคุณสมบัติมากมายที่ Coravel ไม่ได้ โดยเฉพาะอย่างยิ่ง: คิวแบบถาวรกลไกการลองใหม่รองรับไดรเวอร์การจัดเก็บจำนวนมาก ฯลฯ
อย่างไรก็ตาม Hangfire ยังคงอยู่ (ณ เดือนมีนาคม 2566) ไม่สนับสนุน async/await จริง (ที่นี่และที่นี่) ซึ่งหมายความว่าการใช้ Hangfire ภายในเว็บแอปพลิเคชันจะไม่มีประสิทธิภาพเท่าที่ควรเมื่อใช้เธรดที่ดำเนินการ I/O
Coravel ถูกสร้างขึ้นด้วย C# ที่ทันสมัยและ. NET Primitives ในใจ - เช่น async/await และ Utilities การฉีดพึ่งพาการพึ่งพาในตัวของ. NET ซึ่งหมายความว่า Coravel สามารถกำหนดค่าได้ง่ายขึ้นและจะมีประสิทธิภาพมากด้วยเธรด / HOG HOG ที่เว็บแอปพลิเคชันของคุณต้องการตอบสนองต่อคำขอ HTTP ที่เข้ามา
ควอตซ์เป็นห้องสมุด Java รุ่นเก่าที่พอร์ตไปยัง. NET มันยังไม่ได้เชื่อมต่อกับเครื่องมือฉีดพึ่งพา. NET ที่ทันสมัยได้ดี บางคนคิดว่า API ของ Coravel นั้นกระชับและเข้าใจได้มากขึ้น
ตัวอย่างเช่นการเปรียบเทียบตัวอย่างนี้จากเอกสารของพวกเขากับวิธีการทำงานกับ Coravel คือ (เช่นคุณไม่จำเป็นต้องเข้าใจวิธีการ "เริ่ม" และ "หยุด" ตารางเวลาของ Coravel แต่คุณต้องทำงานด้วยตัวกำหนดเวลาควอตซ์ด้วยตนเอง)
ไม่อย่างน้อยก็ยังไม่
Coravel ประมวลผลรายการที่เข้าคิวในหน่วยความจำ เมื่อแอปพลิเคชันของคุณลดลงจะไม่อนุญาตให้แอปพลิเคชันปิดเครื่องจนกว่าจะดำเนินการทั้งหมด
ปรัชญาของ Coravel นั้นทำงานได้ดีกับ. NET Primitives อื่น ๆ - ซึ่งหมายความว่าการใช้ห้องสมุดอื่นเป็นเรื่องง่าย
Coravel ไม่สนับสนุนกลไกการลองใหม่ภายในเพราะฉันระมัดระวังไม่ให้โบลเชียลกับสิ่งที่ไม่จำเป็น ฉันต้องการให้ Coravel จดจ่อกับสิ่งที่ดีที่สุด (เช่น "ฉันต้องการการจัดตารางงานการเข้าคิว ฯลฯ โดยไม่ต้องใช้โครงสร้างพื้นฐานเพิ่มเติมและการกำหนดค่าที่ซับซ้อน")
ตัวอย่างเช่นคุณสามารถใช้ Polly ภายในการเรียกร้องของคุณเพื่อทำการลองใหม่ บางคนจะกำหนดค่าคลาสพื้นฐานที่สืบทอดมาจาก IInvocable ที่มีการลองใหม่ในตัว
ไม่อย่างไรก็ตามสิ่งนี้สามารถทำได้อีกครั้งโดยใช้ห้องสมุดล็อคแบบกระจายการต่อสู้ที่ผ่านการทดสอบการต่อสู้เช่น DistributedLock คุณอาจสร้าง 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 ( ) ;
}
}
}