Service Nedir

Angular da Service uygulamanın ihtiyaç duyduğu değer, metod ve özellikleri sağlayan bir yapıdır.

Aynı şeyleri teknik Component’ ler de sağlayabilir. Sonuç itibari ile hepsi birer TypeScript class’ ıdır. Lakin Angular’ ın Service yapısını oluşturmasının sebebi, modülarite ve tekrar kullanılabilirliği arttırmak istemesidir. Component’ lerin içerisindeki değerler, metodlar ve diğer şeyler, sadece o component’ in view’ ına dair şeyler olmalıdır. Çünkü her component kendi view’ ından sorumludur. Diğer işleri ise ona ve diğer component lere sağlayacak Service’ ler olmalıdır.

Bu durum gerçek hayatta da böyledir. Her işletme kendi business’ ı ile ilgilenir, diğer yan ihtiyaçlarını ise service’ ler vasıtası ile karşılar.

Kısacası, bir Component ile Service’ i teknik olarak birbirinden ayırmak çok da mümkün değildir. Bu ayrımı bir TypeScript class ile HTML Template dosyası arasında yapmak kadar kolay değildir.

İdeal olanı, Component’ in asli görevi adeta bir sekreter gibi çalışmaktır. Ulaşılmak, dinlemek, not almak, iş’ i iş’ in muhatabına(service) paslamak ve sonucu view üzerinde kullanıcı ile paylaşmaktır.
Bu sebeple, Component’ ler olabildiğince sadece olmalıdır.

Component’ ler pek çok işi Service’ e devredebilir;

  • API’ ler üzerinden veri alışverişi
  • Kullanıcı girdisi validasyonu
  • vb.

Service leri injectable olarak tanımlayınca, pek çok component tarafından kullanılabilir hale getiriyoruz.

Dependency injection (DI)

Service tanımalamak için @Injectable decorator’ ü kullanıyoruz. Angular, bootstrap aşamasında Injector adında bir yapıyı kurar ve bu sayede tüm dependency’ leri ilgili component’ lere yada ihtiyaç duyan service’ lere sunar. Bu işlemin merkezi bir Injector yapısı ile sağlanıyor olması çok faydalıdır. Bu sayede, eğer mümkünse, bir service’ den elde edilmiş instance, pek çok yerde tekrar kullanılabilir.

Angular bir Component’ ten instance yani bir örnek elde ederken, component’ in constuctor metoduna bakarak, o component’ in ihtiyaçlarını belirler.

constructor(private service: ProductService) { }
  • Belirledikten sonra, öncelikle Injector’ da bu dependency’ den hali hazırda bir instance olup olmadığına bakar, yoksa oluşturur ve Injector’ a ekler.
  • Tüm dependency ler elde edildikten sonra, ilgili component’ lerin constructor metodları cağrılır ve böylece, dependency injection yapılmış olur.

Providing service

Service için kullandığımız decorator basit olarak şu şekildedir;

@Injectable({
 providedIn: 'root',
})
  • providedIn parametresi, service’ in hangi seviyede injectable olduğunu tanımlar. Örneğin root değeri, service’ in uygulama boyunca her yerden injecte edilebileceğini belirtir.

Service’ leri injecte ederken ise, injecte edilecek yapının "providers" parametresine yazılır;

@NgModule({
  providers: [
  ProductService
 ],
 ...
})

Artık bu service ilgili module ve bu module bağlı alt module lerin component’ lerinde ortak olarak kullanılır.

Eğer ki Component’ in providers parametresinde ilgili service’ i injecte ederseniz, bu component’ in tüm instance’ ların ortak olmayan yeni bir service oluşturulur.

@Component({
  selector:    'product-list',
  providers:  [ ProductService ]
})
Last modified: 2 November 2019

Author

Comments

Write a Reply or Comment

Your email address will not be published.