.NET Core Daemon
Merhabalar, Bu yazımda .NET Core ile Linux, Mac veya Windows ortamlarında arkaplanda çalışacak bir uygulama geliştirmeyi anlatacağım.
.NET bu konuda büyük zorluklar çıkartırken .NET Core ile bu tarz uygulamaları hazırlamak artık çok kolaylaştı.
Bu yazıda yapacağımız proje kodlarına Github adresimden ulaşabilirsiniz.
CLI’de .NET CoreProje Oluşturma;
Öncelikle bir uygulama oluşturarak işleme başlıyoruz, .NET Core şablonundan bir proje başlatmak için komut ekranında aşağıdaki parametreyi çalıştırıyoruz.
dotnet new console --name MyDaemonApplication
![](https://i0.wp.com/www.yazilimliderleri.com/wp-content/uploads/2019/01/image-60.png?w=780)
Projemizi oluşturduk, ilgili dizine giderek oluşan proje dosyalarımızı kontrol edebiliriz.
![](https://i0.wp.com/www.yazilimliderleri.com/wp-content/uploads/2019/01/image-62.png?w=780)
Projemizin bir Daemon gibi arka planda çalışabilmesi için proje dosyamızda bir kaç değişiklik yapmamız gerekiyor .csproj
Bu dosya temel parametrelerin tutulduğu xml formatında bir dosyadır, MyDaemonApplication.csproj dosyasını herhangi bir editörde açarak C# 7.1 kullanılmasını belirtiyoruz.
Aşağıdaki kodu </project> tagından önce ekleyin.
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<LangVersion>7.1</LangVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<LangVersion>7.1</LangVersion>
</PropertyGroup>
Şimdi bazı uzantılar ekleyeceğiz, bu uzantılar Console uygulamalarında çalışabileceği gibi web uygulamalarında da çalışabilen uzantılardır. yine </project> tagından önce aşağıdaki kodları ekliyoruz.
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration" Version="2.1.1" />
<PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" Version="2.1.1" />
<PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="2.1.1" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.1.1" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="2.1.1" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="2.1.1" />
<PackageReference Include="Microsoft.Extensions.Logging.Configuration" Version="2.1.1" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="2.1.1" />
<PackageReference Include="Microsoft.Extensions.Options" Version="2.1.1" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="2.1.1" />
</ItemGroup>
Şimdi dosyamızı kaydediyoruz, ve tekrar CLI’ye dönerek aşağıdaki komut ile eklediğimiz uzantıları kuruyoruz.
dotnet restore
![](https://i0.wp.com/www.yazilimliderleri.com/wp-content/uploads/2019/01/image-63.png?w=780)
İşlem başarıyla tamamlandıktan sonra Program.cs dosyamızı düzenlemeye başlayabiliriz, aşağıdakileri en tepeye ekleyerek kullanmamız gereken kütüphaneleri belirtiyoruz.
using System.Threading.Tasks;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
Main methodu async olarak ayarlıyoruz.
public static async Task Main(string[] args)
![](https://i0.wp.com/www.yazilimliderleri.com/wp-content/uploads/2019/01/image-65.png?w=780)
Main method’da ki kodu aşağıdaki gibi değiştiriyoruz, bu kod HostBuilder class’ı kullanarak Daemon yapılandırmasını ayarlar.
Programın arka plan olarak çalıştırmak için method RunConsoleAsync yöntemidir.
var builder = new HostBuilder()
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.AddEnvironmentVariables();
if (args != null)
{
config.AddCommandLine(args);
}
})
.ConfigureServices((hostContext, services) =>
{
services.AddOptions();
services.Configure<DaemonConfig>(hostContext.Configuration.GetSection("Daemon"));
services.AddSingleton<IHostedService, DaemonService>();
})
.ConfigureLogging((hostingContext, logging) => {
logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
logging.AddConsole();
});
await builder.RunConsoleAsync();
Şimdi dosyamızı kaydederek, yeni bir class oluşturuyoruz
DaemonService.cs isimli class’ı oluşturarak aşağıdaki kodları ekleyelim.
using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
namespace MyDeamonApplication
{
public class DaemonService : IHostedService, IDisposable
{
private readonly ILogger _logger;
private readonly IOptions<DaemonConfig> _config;
public DaemonService(ILogger<DaemonService> logger, IOptions<DaemonConfig> config)
{
_logger = logger;
_config = config;
}
public Task StartAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Starting daemon: " + _config.Value.DaemonName);
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Stopping daemon.");
return Task.CompletedTask;
}
public void Dispose()
{
_logger.LogInformation("Disposing....");
}
}
}
ve son olarak DaemonConfig.cs isimli bir class daha oluşturuyoruz ve aşağıdaki kodları ekliyoruz.
public class DaemonConfig
{
public string DaemonName { get; set; }
}
Son proje yapımız aşağıdaki şekilde;
![](https://i0.wp.com/www.yazilimliderleri.com/wp-content/uploads/2019/01/image-66.png?w=780)
Artık projemiz derlenmeye hazır, CLI ekranına geri dönerek aşağıdaki komutları çalıştırarak uygulamayı oluşturuyor ve başlatıyoruz.
dotnet build
dotnet run --Daemon:DaemonName="Test Daemon"
![](https://i0.wp.com/www.yazilimliderleri.com/wp-content/uploads/2019/01/image-68.png?w=780)
Uygulamamız başarıyla arkaplanda çalışmaya başladı CTRL+C tuşlarına basana kadar uygulama çalışmaya devam edecektir kapatmak için bu tuşlara basmamız gerekiyor.
Burada yaptığımız proje kodlarına Github adresimden ulaşabilirsiniz.