2009-12-02 26 views
7

WSSF kullanarak bir WCF Web Hizmeti oluşturuyoruz. Buradaki fikir, ana veri tabanımızın hizmet yoluyla açığa çıkması ve hizmetin üstünde çeşitli uygulamalar ve web siteleri oluşturmamıza izin vermesidir. Şu anda bu hizmetten bazı verileri indirecek basit bir istemci uygulaması yapıyorum, daha sonra kullanıcılara bir rapor CSV dosyası olarak verin.WCF/İstemci uygulamaları - iş mantığı nereye gitmeli?

Şimdi asıl soru iş mantığının (verileri manipüle eden) nerede konumlandırılacağıdır? Servisin içine koyacağımı düşündüm. Veritabanında neredeyse birebir eşleştiren basit nesnelerle (müşteri, sipariş vb.) Bir iş katmanım var. Verileri manipüle etmek için bazı "daha yüksek seviyeli" objeler yapacağımı düşündüm. Örneğin, müşteri, sipariş ve diğer nesneleri kullanarak ve bir rapor üreterek vb. Bunun için en iyi yerin hizmet için iş katmanında olacağını düşündüm. Bu şekilde gerekirse bu mantığı çeşitli farklı uygulamalar için yeniden kullanabiliriz.

Maalesef patronum kabul etmiyor. Bir "endişelerin ayrılığı" istiyor ve bu mantık için doğru yerin hizmet yerine müşteri uygulamasında bir iş katmanında olacağını söyledi. Bu daha basit olabilirdi, ancak bu kodu yazmak için güçlü nesne modelimi hizmet iş katmanında kullanmak istiyorum. Hizmet tarafından açığa çıkan nesneler, "gerçek" nesneler değildir ve hizmet iş katmanının içinde mevcut olan tam nesne modelinin gücü olmadan gerçekten sadece hafif veri yapılarıdır.

Siz ne düşünüyorsunuz? Yardım için çok teşekkürler.

Alkış Mark

+4

ona sor: eğer başka bir müşteriye ihtiyacımız varsa, tüm iş mantığını kopyalamalı mı, yoksa merkezi bir versiyon mu kullanmalıyız? –

+2

@Rubens Farias 'mantığı ile devam ediyor, eğer iş mantığı sabitlenmeli ve istemcide bulunuyorsa, o zaman * tüm * müşterilerin güncellenmesi gerekiyor. Serviste ise, sadece servis güncellenmelidir. –

+0

Yanıtlar için teşekkürler. Evet, yeniden kullanılabilirliğin de iyi olduğunu düşünüyorum. Olumsuz olan, servisin güncellenmesinin mevcut tüm müşterileri yıkabileceğidir. –

cevap

0

ne olduğunu düşünüyorum "doğru" Başvurunuz mimarisine göre değişir. Endişelerin ayrılmasında kesinlikle değer vardır. Patronunuz şu anki modelin sunucuyu veritabanını iş nesnelerine aktaran bir veri erişim katmanı olarak kullanmak olduğunu ve iş mantığının istemci üzerinde uygulanması gerektiğini düşünüyor. İş mantığının istemcide mi yoksa sunucuda mı uygulandığı konusunda endişeleriniz hala ayrılabilir. Bu, sayılan işlemleri yaptığınız yer değil, uygulamanın katmanları arasındaki arayüzleri ne kadar temiz bir şekilde tasarladığınızdır.

İstemci hakkında daha fazla bilgi edinmeye yardımcı olabilir. Bir tarayıcı/Javascript istemcisi ile mi uğraşıyorsunuz? Öyleyse, sunucuda mümkün olduğunca çok işlem yapmayı sürdürürüm ve istemciye gösterilmesini istediğiniz formda istemciye veri gönderirdim.

Eğer bir C# istemcisiyse, o zaman üzerinde çalışmak için çok daha fazla güce sahipsiniz. WCF hizmetinin yanıtlarını sunucu tarafında kullandığınız aynı iş nesnesi sınıflarına yeniden oluşturup sunucuda sahip olduğunuz gücün aynısını alabilirsiniz. (Sadece iki çözüm arasındaki iş nesnesi sınıflarını paylaşın.)

+0

Yorumlar için teşekkürler. WCF web servisinin bu kullanımı için 2 istemci bileşeni olacaktır. Bir Asp.NET web uygulaması ve ayrıca bir .NET Windows servisi. Bu, müşteri tarafında hiç güç kesintisi olmadığı anlamına gelir. Aslında, standart iş nesnelerini (WCF web hizmetinde Save() ve istek üzerine yüklenen özellikler gibi) yöntemlerle gösteremezsiniz. Ortaya çıkardığı nesneler, "veri sözleşmeleri" adı verilen basit veri yapılarıdır. –

+0

DataContract/DataMember öğeleri, aslında ağ üzerinden nasıl gönderileceğini belirleyen nesneye yönelik bir arabirimdir. Yine de her türlü yöntemi buraya koyabilirsiniz. Bu yöntemlerin kendileri web hizmeti isteklerinizi kullanarak gönderilmezler, ancak her iki uygulamada da aynı işleve sahip kütüphaneleri kullandıkları sürece sınıf tanımının bir parçası olarak vardırlar. Açıkçası, Save() gibi bazı işlemler sadece bir uçta veya diğerinde gerçekleşebilir (sunucuda Save() olması gerekir). Öte yandan, istemcinin, hizmetin kaydetme yöntemini çağıran bir ClientSave() yöntemi olabilir. –

+0

Bu çok ilginç Nate. Bu ihtimali düşünmedim. İş katmanlarını iş katmanında tutmak daha iyi olabileceğini düşünüyorum. Veri katmanlarından iş katman nesnelerine, hizmet katman nesnelerine dönüştüren bir acı olmasına rağmen ... –

0

Bunun için zor ve hızlı bir kural yoktur, ancak bu durumda patronunuzun sizden daha yanlış olduğunu söyleyebilirim :) Herkes biraz farklı olacak Bu konuda görüş ve iş mantığının iş katmanından başka bir yere koyulmasının birtakım nedenleri olabilir, ancak istemci uygulamasında bunu koymak için nadiren bir neden vardır - müşteride olduğunda bunu tartışabilirsiniz Uygulama daha sonra bir iş kuralı yerine bir kullanıcı arayüzü veya sunum kuralıdır.

Web hizmetleri bir dizi uygulama tarafından kullanılacaksa, mümkün olduğunca webservice tarafında iş mantığını istiyorsunuz. Aslında çok ince bir web servis katmanına sahip olurdum, hepsi bu çağrıyı kabul ediyor ve ardından yürütmeyi asıl iş katmanına aktarıyor. Ayrıca veritabanı katmanı ile iş katmanındaki veritabanı katmanında yapılan iş verileri varlıkları arasında eşleşme olacaktır.

+0

Merhaba Slugster Evet kullanarak. Veri katmanı, ADO Entity Framework'dür ve Entity Framework nesnelerini kullanarak doldurulan nesnelerle bir iş katmanım var. Bu katman, kodun çoğunu içerir. WCF web servis katmanı WSSF (Web Service Software Factory) kullanılarak oluşturulmuştur. Bu katman sadece iş nesnelerini WCF mesajlarına dönüştürür. –

7

Oyumu açık olacaktır:

  • hizmet sunucu tarafında bir iş mantığı tabakasının içine başka iş mantığı çekleri koymak
  • veritabanına veri bütünlüğü kontrolleri kadar koymak
  • optimal otomatik veritabanı modelinden belirlenen istemci katmanına vs. "gerekli alanı", ya da iş modeli gibi
  • koymak sadece basit kontroller

Neden veritabanı?
Herhangi bir şekil veya formdaki SQL'de bazı çok basit ve çok güçlü çek yetenekleri vardır - her şeyin benzersiz olduğundan emin olun, tablolar arasındaki ilişkisel bütünlük sağlandığından emin olun - USE IT! Veritabanında bu kontrolleri yaparsanız, o zaman kullanıcı nihayetinde verilerinize nasıl bağlanır olursa olsun (korku senaryosu: yöneticiler, bazı İş Zekası çalışmaları yapmak için Excel ile doğrudan masalarınıza bağlanabileceklerdir.) Çekler yerinde olacak ve uygulanacak. Veri bütünlüğünü zorunlu kılmak, herhangi bir sistemde en yüksek gereksinimdir.

Sunucuda neden iş mantığı var?
Diğer yanıt verenlerin aynı nedenden ötürü: merkezileştirme. İş mantığına ve çeklerinize yalnızca istemcide sahip olmak istemezsiniz. Şirketinizdeki ya da üçüncü taraf bir dış danışmanın başka bir departmanı aniden hizmetinizi kullanmaya başlarsa ne olur, ancak onlar hakkında bilmedikleri için tüm doğrulama ve iş kontrolleri yerinde olmazsa ne olur? İyi bir şey değil ...... istemci

Mantık
Evet, tabii ki - ayrıca bir web uygulaması var, özellikle istemci içine bazı basit kontroller koymak istiyorum. "Bu alan gereklidir" veya "bu alan için maksimum uzunluk" gibi şeyler mümkün olduğunca erken uygulanmalıdır. İdeal olarak, bu, müşteriler tarafından veritabanı/hizmet katmanından otomatik olarak alınır. ASP.NET sunucu denetimleri, otomatik olarak açılabilen istemci doğrulamaya sahiptir, Silverlight RIA Servisleri arka uç veri modelinizde veri kısıtlaması alabilir ve bunları istemci katmanına taşıyabilir.

+1

Detaylı yanıtınız için teşekkürler Marc. Tüm yorumlarınızla kesinlikle katılıyorum! Sanırım bahsettiğim mantık, çeşitli yerlerden gelen verileri bir raporda veya bir çeşit ihracat dosyasında toplamaktır. Bütünlüğü kontrol etmek çok fazla değil. Ancak, yorumlarınızdan ve diğerlerinden, çoğu geliştiricinin de bu tür şeyleri servis iş katmanına koyacağı anlaşılıyor. Hizmetin maruz kaldığı hafif veri sözleşmelerinden ziyade, bu katmandaki tam şişmiş iş nesnelerine erişimim olursa, geliştirilmesi çok daha kolay olacaktır. Alkışlar Bir uyarı ile Marker –

+0

10 +1. Müşterilerinizin çeşitlendirebileceği olasılıklar (şu an için endişelenecek kadar kısa bir süre var), yani, müşterilerinizin biraz farklı mantığa, üçüncü tarafın hizmetini kullanmasına veya daha genelleştirilmiş kullanıma ihtiyaç duydukları. Bu koşullarda, tek bir merkezi BLL, her bir istemci için ne yapılacağını öğrenmek için birçok kontrol mantığına sahip olabilir. Tamam, bu nedenle hizmet katmanında bir soyutlama katmanı oluşturmak yardımcı olabilir ve genellikle hile yapar. Mantıksal olarak endişeleri ayırmak için bir neden yok, ama fiziksel/uygulama bilge onları bir araya getirin. Kek ve ye? – MattC

+0

@MattC: evet, doğru - birkaç istemciyi desteklemeniz gerekiyorsa, gereksinimleriniz birbirinden ayrılabilir. Ama ben hala sunucuda üç, beş farklı doğrulama kuralları kümesinin bile onlarca veya yüzlerce müşterinin güncellemesine sahip olmaktan daha kolay olduğunu düşünüyorum. –

İlgili konular