.Net Core’a Yeni Proje Tipi Eklemek: Worker Service (Extended)

Faruk Terzioğlu
5 min readOct 13, 2019

.Net Core ile arka planda çalışan servisler geliştirmeyi daha önceki bir yazımda detaylı olarak anlatmıştım. .Net Core 3.0 ile bu tarz uygulamalar için yeni bir proje tipi eklenmiş: Worker Service.

https://medium.com/@nickfane/introduction-to-worker-services-in-net-core-3-0-4bb3fc631225

Bu yazı içerisinde, yeni eklenen Worker Service proje şablonunu değiştirip kendi proje şablonumu oluşturacağım.

Worker Service proje tipinin detaylı incelemelerini yazının sonundaki kaynaklarda bulabilirsiniz. Yeni eklenen Worker Service projesinin içinde kullanılan BackgroundService’ler ile ilgili detaylı yazımı şurada bulabilirsiniz.

Yeni bir Worker Service oluşturmak için;

$ dotnet new worker -n Worker.App

Worker Service tipinde yeni bir proje oluşturduğunuzda, bir arka plan uygulaması için minimum gereksinimler karşılanıyor. Fakat çoğu zaman ek olarak bir çok kod eklememiz gerekiyor. ‘appsetting.json’ dosyasına size özel ayarlar, sık kullandığınız Nuget paketleri, ek class’lar vs.

Yeni proje oluştururken bu tarz tekrar eden işleri azaltmak adına kendim için yeni bir proje tipi oluşturup, daha sonra yaratacağım projeleri bu proje tipi ile oluşturacağım: Worker Service (Extended)

$ dotnet new workerextended -n Worker.Ext.App

Bu yazı içerisinde nasıl yeni bir .Net proje tipi oluşturduğuma değinip kullandığım kaynakları paylaşacağım. Yeni oluşturacağım proje tipini denemek için Nuget’ten yükleyebilirsiniz;

$ dotnet new — install Worker.Extended::1.0.1

Kaynak kodlarını incelemek veya kodlarından yükleyerek kullanmak için;

Yeni Bir Proje Şablonu Oluşturmak

Aşağı yukarı yaptığım adımlar;

  1. Şablona eklemek istediğim proje dosyalarını oluşturmak.
  2. Yeni proje şablonuna özel ayların yapılması. (template.json)
  3. Nuget paketinin ayarlanması ve yayınlanması.

İlk olarak proje şablonunda bulunmasını istediğimiz dosyaları oluşturmalıyız. Benim oluşturacağım şablon Worker Service’den türeyeceği için referans olarak bu proje dosyalarını alıyorum. Yeni bir Worker Service oluşturup dosyalarını alabilirim veya .Net’in kaynak kodlarından proje şablon dosyalarını da alabilirim. Ben .Net Core kaynak dosyalarını referans aldım;

Daha sonrasında, örnek olarak aldığım dosyalara eklemeler yaparak, yeni oluşturacağım projede olmasını istediğim değişiklikleri yapıyorum. Örneğin appsettings.json dosyasına eklemeler, Program.cs dosyasında değişiklikler, Worker.cs dosyasında ekstra exception handling ve loglama gibi. Özelleştirdiğim Worker Service proje dosyalarını şurada bulabilirsiniz;

https://github.com/farukterzioglu/extendedWorker/tree/master/Company.Application1

Daha sonrasında proje şablonu ile ilgili dosyalar için ‘.template.config’ klasörünü oluşturmalıyız. Bu klasör içine de proje şablonu bilgilerini girmek için ‘template.json’ dosyasını oluşturuyoruz. Bu klasörün içeriklerine ve ‘template.json’ dosyasının içeriğine örnek olarak şurayı inceleyebilirisiniz;

https://github.com/aspnet/AspNetCore/tree/master/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config

template.json dosyasının içeriği oldukça geniş, benim değinmek istediğim bir kaç değer şunlar;

“shortName” değeri, yeni proje oluştururken proje tipi olarak belirtilecek olan parametre, örneğin konsol uygulaması için ‘dotnet new console’ gibi.

“sourceName” değeri, kaynak kodlarda geçtiği heryerde proje ismi olarak verilen değer ile değiştirilecek. ‘dotnet new [PROJE_TİPİ] -n Yeni.Proje’ olarak komut verirsek, ‘Yeni.Proje’ değeri, oluşturduğunuz proje şablonunda ‘Company.Application1’ geçen heryerde değiştirilecek. Örneğin namespace’lerde (namespace Company.Application1{} gibi), proje dosyasının isminde (Company.Application1.csproj) veya herhangi bir string değer ile yorum satırlarında. Bunun için oluşturduğunuz şablonda proje dosyalarını güncellerken, proje ismi ile aynı olmasını istediğiniz her yere “sourceName” de belirtilen ifadeyi yazmalısınız.

Aşağıdaki linkte template.json dosyasının tüm değerinin detaylarını bulabilirsiniz;

Yeni ‘Project Item’ Oluşturmak

Sık sık ihtiyac duyduğum bir konu da, mevcut bir Worker Service projesine ek BackgroundService’ler eklemek. Bu BackgroundService’leri de basit halleri ile değil de kendime göre ayarladığım versiyonunu kullanmak için yeni bir “Project Item” tipi tanımlayacağım.

dotnet new workerextended-service -n NewWorker

Aynen yeni proje oluşturduğumuz gibi, mevcut projelere eklemek üzere yeni class, css, js vs. şablonları da oluşturabiliriz. Bu da hemen hemen aynı adımlara sahip, farklı olarak template.json dosyasında tag’ler altında ‘type’ değerini ‘project’ değil de ‘item’ olarak ayarlamalıyız.

Benim oluşturduğum “Worker Service (Extended) Class” class’ını şurada inceleyebilirsiniz;

https://github.com/farukterzioglu/extendedWorker/tree/master/extendedWorkerClass

Aynen proje şablonunda olduğu gibi burada yeni Item’a verilen ismin, kaynak kodda belli yerlerde değiştirilmesi istediğimiz değeri ‘template.json’ dosyasında ‘sourceName’ altında tanımlıyoruz.

“sourceName”: “Worker1”

Oluşturduğumuz şablonları yükleyip denemek için ‘dotnet new -i’ komutunu kullanacağız. Yeni oluşturduğumuz proje şablonunu yüklemek için;

dotnet new -i ./Company.Application1

Aynı şekilde yeni oluşturulan proje item şablonunu yüklemek için;

dotnet new -i ./extendedWorkerClass

Sonrasında ‘dotnet new’ komutunu çağırdığımızda yeni şablonlarımızın listelendiğini görebiliriz;

Yüklü paketleri kaldırmak için ‘dotnet new -u’ komutunu kullanabiliriz. Komutu çağırdığımızda paketleri kaldırmak için gerekli olan komutlar listenecek;

Kurulu paketi kaldırmak için;

dotnet new -u /Users/farukterzioglu/extendedWorker/Company.Application1

Nuget Paketi

Geliştirdiğimiz iki şablonu Nuget paketi olarak yayınlamak için aynı dizine bir .csproj dosyası oluşturmalıyız. Bu proje dosyası normal proje şablonlarından (konsol, API vs) farklı olarak ‘Template’ tipinde. Bu dosya içerisine Nuget paket bilgisinde olmasını istediğimiz değerleri yazıyoruz;

Bu dosya içerisinde de önemli olan kısım, ItemGroup altına Nuget paketinde olmasını istediğimiz projeleri listeliyoruz. Tüm değerlerin açıklamalarını şurada bulabilirsiniz;

https://docs.microsoft.com/tr-tr/nuget/reference/msbuild-targets#pack-target

Buraya yazılan değerler ile oluşturulmuş örnek Nuget paketi sayfası;

https://www.nuget.org/packages/Worker.Extended/

Nuget paketi olarak derlemek için;

dotnet pack

Oluşan paket ile yüklemek için;

dotnet new -i bin/Debug/Worker.Extended.1.0.1.nupkg

Oluşan .nupkg dosyasını kullanarak kendi hesabınız ile aşağıdaki sitede Nuget paketi olarak yükleyebilirisiniz;
https://www.nuget.org/packages/manage/upload

Benim yüklediğim Nuget paketi;

--

--