2010-11-21 17 views
2

Çoğu geliştiricinin sözleşmeleri web hizmetleriyle nasıl tasarladığını görmek için merak ediyorum. Servis mimarisine ve özellikle WCF'ye yeni hizmet vermek için oldukça yeniyim.Web Service Contract Design - Tek Sorumluluk

Kısacası, operasyonlarınızda ne tür nesneler döndüğünüzü öğrenmek isterim ve hizmetinizdeki her işlem aynı nesneyi döndürür mü?

Örneğin aşağıdaki düşünün: Şu anda, benzer bir ServiceBase nesneden devralır oluşturmak Bütün hizmetler: Dolayısıyla

 
public interface IAppResponse<TDto> where TDto : IDto 
{ 
    List<TDto> Data { get; } 
    ValidationResults ValidationResults { get; } 
    RequestStatus Status { get; } 
} 

:

 
public abstract class AppServiceBase<TDto> : DisposableObjectBase where TDto : IDto 
{ 
    protected IAppRequest Request { get; set; } 
    protected IAppResponse<TDto> Response { get; set; } 
} 

Response gibi bir şey oluşturur dönüş nesneyi temsil türetilen herhangi bir hizmet, aynı nesneden oluşan bir yanıtı döndürür. Şimdi başlangıçta, her hizmetin tek bir nesneden sorumlu olmasını zorladığından iyi bir tasarım olacağını hissettim. Çoğunlukla bu işe yaradı, ancak hizmetlerim büyüdükçe, kendimi bu tasarımı sorgularken buldum.

Örnegin: Yazdiginiz müzik hizmetiniz var ve hizmetlerinizden biri "Albümler" olur. Böylece temel CRUD işlemleri yazıyorsunuz ve hemen hemen hepsi bir AlbumDto koleksiyonuna geri dönüyorlar.

Ne tür albüm türlerini döndüren bir işlem yazmak isterseniz. (LP, Tek, EP, vb) Yani bir nesneye sahipsin AlbumTypesDto. Bu nesne için yeni bir hizmet oluşturursunuz veya Albümler hizmetinizin birçok farklı nesne döndürmesini ister misiniz?

Çeşitli değişken dönüş türleriyle karmaşık ve kötü tasarımlı karmaşık bir hizmet hayal edebiliyorum, ancak belki de sadece bir veya iki servis işlem yönteminin aşırı olması için yepyeni bir hizmet yazıyor.

Ne düşünüyorsunuz?

cevap

1

Hizmetlerinizi etki alanı sorununuz etrafında tasarlamak iyi bir fikirdir. Hizmette bir CRUD kalıbı ortaya çıkararak, esas olarak veri erişimi için servisler kullanıyorsunuz. Bunun riski, işinizin mantığını hizmetinizi tüketen her ne olursa olsun sona erecektir.

Sen hizmet çözmeye çalışıyoruz sorununa relavent yöntemleri göstermek gerekir (ki genellikle UI üzerinde operasyon üzerine gevşek modeller) size veri sözleşmeleri sorununa daha doğal sığdırmak başlar göreceksiniz Buradan

"tek beden herkese uyar" sözleşmeleri oluşturmak yerine çözmeye çalışıyorsunuz.

İyi bir başlangıç ​​için Google "Domain Driven Design" Ancak, bu konuda birçok referans malzeme var.

+0

Cevabınız için teşekkürler Slappy. Geçtiğimiz yıl için DDD ile çalışıyorum ama şimdiye kadar bir hizmet katmanına ihtiyaç duymadım. Lütfen ne demek istediğini açıklığa kavuşturabilir misiniz: "Bunun riski, işinizin mantığının hizmetinizi tüketen her şeyden kaynaklanacak olmasıdır." Yanıtınıza bağlı olarak, sözleşme işlemlerimi tek bir yanıt türüyle sınırlamamalıyım, yalnızca sorunla ilgili nesneleri döndürmelerini sağlamalıyım. DDD ve servis katmanı tasarımını okumaya devam edeceğim. – Daniel

+0

İş mantığı CRUD rutinlerini tüketir. WEB servisinizde CRUD uygulamasının yapılması, tüketicinizin (bu durumda gümüş aydınlatma uygulaması) iş mantığına ev sahipliği yapacağı anlamına gelecektir.Aklıma göre iş mantığını web servislerinde kapsülleyeceğim, bu yüzden Silverlight uygulamanızın sadece sunumla ilgilenmesi gerekiyor. – Slappy

İlgili konular