Yazılım

.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

Projemizi oluşturduk, ilgili dizine giderek oluşan proje dosyalarımızı kontrol edebiliriz.

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

İş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)

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;

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"

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.

Ali UYSAL

IT alanında 16 sene önce donanım ile başlayan tecrübem, network ve sonrasında iş analizi, yazılım geliştirme ve proje yöneticiliği alanlarında devam etmiştir. Endüstriyel yazılımlar, sahadan veri toplama ve analizleri, otomatik etiketleme ve barkod sistemleri, otomatik tartım ve robotik konularında tecrübe sahibiyim. Sanayi 4.0 kapsamında imalat sanayinin dijital dönüşümünde çok fazla projenin hayata geçmesini sağladım.Open Source projelerle uzun süre ilgilendim, analiz ve implementasyonu konularında tecrübe edindim. Bunlar dışında hobi amacıyla başlasam da sonradan ürüne dönüşen, geliştirme kartları ile farklı çalışmalarım olmuştur.Raspberry Pi üzerinde yaptığım donanımsal ve yazılımsal işler ile çok farklı ürünler ortaya çıkartarak tecrübe edindim.

İlgili Makaleler

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu