En iyi uygulamalar: Karmaşık sistemler için Cephe tasarım modelini kullanarak Açısal Hizmetler Oluşturma

Açısal Hizmetler

Açısal servisler konsepti her zaman yenilikleri sunucu tarafındaki REST servisleriyle karıştırır. Ne olduğundan hala emin değilseniz, size Açısal belgeleri okumanızı tavsiye ederim.

Açısal Hizmetler, bileşenlere uygulama verileri / iş mantığı sağlama sorumluluğuna sahiptir. Bileşenler servise veri almalı / sağlamalıdır ve görünüm ile servis arasında tutkal görevi görür. Sahte veri sağlamaya ya da sunucuya gidip veri tabanından / dosyadan / başka hizmetlerden veri almaya karar verebilecek olan hizmettir.

İdeal olarak, hizmetler özellik odaklı olmalıdır. Dev bir servis sınıfı veya mikro servis koleksiyonları oluşturma seçeneğiniz var. İlk yaklaşımda, tüm iş mantığını içerecek ve sistemdeki tüm bileşenlerde Açısal Bağımlılık Enjeksiyonu ile sağlanacak tek bir hizmet bulunacaktır. Bu yaklaşımla ilgili mesele şu ki, dev hizmet sınıfı sonunda liderlik performans sorununu şişirecek. Her bileşene, tüketici bileşeni için hiç gerekli olmayan hizmet ve işlevsellik enjekte edilir. Sence iyi mi?

İkinci yaklaşımda (yaygın olarak takip edilir), özelliğe özgü mikro hizmet inşa edilir. Örneğin, sisteminizde Login, SignUp, Dashboard bileşenleri varsa, LoginService, SignUpService, DashboardService vb. Her hizmet belirli hedeflenen bileşen için gereken işlevselliği içermelidir. Şimdi bu tasarım iyi görünüyor, değil mi?

Sorun?

Angular kullanarak büyük ve karmaşık Tek Sayfa Uygulaması oluştururken, yakında yüzlerce ve binlerce bileşen sınıfına sahip olacaksınız. Bunu söylerken, enjekte edilen benzer sayıda Açısal hizmetlere sahip olmalısınız. Burada problem nedir?

Yapı bileşenleri ve hizmetleri için ne kadar iyi adlandırma kuralı izleseniz de, belirli bir sınıf için belirli bir hizmet adını bulmak için zaman gerekir. Ayrıca, yinelenen servis sınıfını, diğer bileşenlerden oluşturulmuş aynı bileşen için biraz farklı bir adla yazabilirsiniz. Extreme Programming modelinde çalışıyorsanız, öncü geliştiricilerinizin modüller / bileşenler / özellikler arasında geçiş yapması beklenir. İlgili bileşenleri ve hizmetleri anlamaları çok zaman almamalıdır.

Çözüm

Bu sorunu Cephe tasarım modelini kullanarak çözebiliriz.

Cephe Tasarımı Deseni

Cephe, karmaşık bir alt sistemi tek bir arabirim nesnesinde kapsıyor. Bu, alt sistemi başarıyla kullanmak için gerekli öğrenme eğrisini azaltır. Ayrıca, alt sistemi potansiyel olarak birçok müşterisinden ayrıştırmayı da teşvik eder.

Cephe nesnesi oldukça basit bir savunucu veya kolaylaştırıcı olmalıdır. Her şeyi bilen bir kahin veya “tanrı” nesnesi olmamalıdır.

İşte Cephe tasarım deseni için ayrıntılı okuma

Cephe Tasarımı Deseni

Açısal Hizmetler ile eylem halinde olan cephe

Cephe modelini kullanarak açısal hizmetler oluşturmak için aşağıdaki adımları öneririm:

Tüm Açısal hizmetlerinizi iş gereksiniminize göre tanımlayın ve / veya ihtiyaç duyduğunuz kadar fazlasını eklemeye devam edin.

“FacadeService” adlı bir servis oluşturun (burada başka bir isim kullanmaktan çekinmeyin)

Paylaşılan bir NgModule oluşturun ve tüm Açısal hizmetleri sağlayın

Cephe Hizmeti uygulaması

Asıl görüşmemiz yalnızca “Cephe Hizmeti” hizmeti ile ilgili olacaktır.

Dev servis ve mikro servis olmak üzere iki yaklaşım hakkında tartıştık. Artılarını ve eksilerini gördük. En iyi çözüm, servis cephesi oluşturmak için her ikisini de birleştirmektir. Şimdi, FacadeService sınıfı bir Tanrı sınıfı olacak, ancak gerçek işlevlere sahip olmayacak, gerçek hizmetlere ilişkin bir paketleyici olmayacak.

Cephe Hizmeti, söz konusu sistemdeki tüm Açısal hizmetleri toplar. Kolay bir yaklaşım, FacadeService içindeki tüm hizmetleri yapıcıya enjekte etmektir. Ancak bunu yaparsak, dev hizmet sınıfında olduğu gibi benzer bir sorunla karşı karşıya kalacağız.

Akıllı yol, FacadeService içindeki tüm Açısal hizmetleri bir araya getirmek ve örneklerini “özellik” erişimi içindeki Angular DI'den çözmek olacaktır.

AccountService kullanımını tartışalım.

FacadeService içinde accountService adlı bir özelliğe sahibiz. FacadeService'in getOrderList () ve getAddress () işlevleri, accountService'in gerçek yöntemleri için sarmalayıcı olarak çalışır.

AccountService üyesine ne zaman erişilirse, onun get özellik bloğu çalıştırılır. Get bloğunun içinde, yedek alanın _accountService başlatılıp başlatılmadığını kontrol ederiz. Olmazsa, bizden bir örneği çözmesi için Açısal Bağımlılık Enjektöründen sorarız.

Angular DI motoruna erişmek için Inejctor Angular’ın yerleşik servisini, FacadeService yapıcısının içine enjekte etmemiz gerekir. injector.get (), sağlandığı takdirde istenen servis örneğini çözmek için Angular’ın DI motorunu sorgulayacaktır. (Tüm hizmetleri sunduğumuz SharedModule'ü hatırlıyor musunuz?)

Dikkatli bir şekilde gözlemlediyseniz, SingleS tasarım modelini, accountService özelliğinin mülk bölümünde edindik.

Tüketici Cephe Hizmeti (bileşenlerin) içinde

FacadeService içinde toplanmış AccountService'imiz var ve OrderComponent ve AddressComponent içinde tüketilmeye hazır.

Kalan sistemi bitirmek

AccountService uygulaması benzer notunda, FacadeService içindeki diğer Açısal hizmetlerin uygulanmasını tamamlayabilirsiniz.

Açısal Servislerde Cephe Tasarım Deseninin Uygulanması

Canlı demo:

GitHub deposu:

özet

Cephe tasarım deseni, birçok karmaşık Açısal mikro hizmete basitleştirilmiş erişim sağlayarak karmaşık Açısal uygulama oluşturmamıza yardımcı olmaktadır.

Şerefe!