ارتقاء به NET Core 3.0.: پشتیبانی از ایجاد سرویسهای پسزمینه
یکی از تغییرات مهم قالب ایجاد پروژههای ASP.NET Core 3.0،
تغییر فایل program.cs آن است که در آن از یک Generic Host بجای روش قبلی Web Host، استفاده شدهاست. علت آن فراهم آوردن امکان استفادهی از قابلیتهایی مانند تزریق وابستگیها، logging، تنظیمات برنامه و غیره، در برنامههای غیر وب نیز میباشد. یکی از این انواع برنامهها، سرویسهای پسزمینهی غیر HTTP هستند. به این ترتیب میتوان برنامهای شبیه به یک برنامهی وب ASP.NET Core را ایجاد کرد که تنها کارش اجرای سرویسهای غیر وبی است؛ اما به تمام امکانات و زیر ساختهای ASP.NET Core دسترسی دارد.
برای ایجاد این نوع برنامهها در NET Core 3x. میتوانید دستور زیر را در پوشهی خالی که ایجاد کردهاید، اجرا کنید:
ساختار برنامهای که توسط این دستور تولید میشود به صورت زیر است که بسیار شبیه به ساختار یک برنامهی ASP.NET Core است:
appsettings.Development.json
appsettings.json
MyWorkerServiceApp.csproj
Program.cs
Worker.cs
- فایل csproj آن دارای این محتوا است:
<Project Sdk="Microsoft.NET.Sdk.Worker">
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
<UserSecretsId>dotnet-MyWorkerServiceApp-B76DB08E-FFBB-4AD1-89B5-93BF483D1BD0</UserSecretsId>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Hosting" Version="3.0.0-preview8.19405.4" />
</ItemGroup>
</Project>
در آن ویژگی Sdk به Microsoft.NET.Sdk.Worker اشاره میکند و همچنین از بستهی Microsoft.Extensions.Hosting استفاده شدهاست.
- محتوای فایل Program.cs آن بسیار آشنا است و دقیقا کپی همان فایلی است که در برنامههای ASP.NET Core 3x حضور دارد:
namespace MyWorkerServiceApp
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Worker>();
});
}
}
در اینجا یک Generic host را بجای Web host قالبهای پیشین فایل Program.cs ملاحظه میکنید که هدف اصلی آن، عمومی کردن این قالب، برای استفادهی از آن در برنامههای غیر وبی نیز میباشد.
در متد ConfigureServices، انواع اقسام سرویسها را منجمله یک HostedService که در مطلب جاری به آن پرداخته شده، میتوان افزود. سرویس Worker ای که در اینجا به آن ارجاعی وجود دارد، به صورت زیر تعریف شدهاست:
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
public Worker(ILogger<Worker> logger)
{
_logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
await Task.Delay(1000, stoppingToken);
}
}
}
با ساختار این کلاس نیز آشنا هستید و موضوع اصلی مطلب جاری است.
یک نکتهی تکمیلی: روش تبدیل کردن یک BackgroundService به یک Windows Service
اگر برنامهی NET Core. شما در ویندوز اجرا میشود، میتوانید این برنامهی BackgroundService را به یک سرویس ویندوز NT نیز تبدیل کنید. برای اینکار ابتدا بستهی نیوگت Microsoft.Extensions.Hosting.WindowsServices را به پروژه اضافه کنید. سپس جائیکه CreateHostBuilder صورت میگیرد، متد UseWindowsService را فراخوانی کنید:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseWindowsService()
.ConfigureServices((hostContext, services) =>
{
//services.AddHttpClient();
services.AddHostedService<Worker>();
});
تا اینجا هنوز هم برنامه، شبیه به یک برنامهی کنسول دات نت Core قابل اجرا و دیباگ است. اما اگر خواستید آنرا به صورت یک سرویس ویندوز نیز نصب کنید، تنها کافی است از دستور زیر استفاده کنید:
cs create WorkerServiceDemo binPath=C:\Path\To\WorkerServiceDemo.exe
البته برای لینوکس نیز میتوان از
UseSystemd استفاده کرد که نیاز به نصب بستهی Microsoft.Extensions.Hosting.Systemd
را دارد:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseSystemd()
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Worker>();
});