API ve uygulama arasında nesne paylaşma düzeni


9

Web uygulamamın tasarımı hakkında ciddi şüphelerim var.

İş mantığını arayüzden ayırmak istedim, böylece veritabanına yapılan tüm istekleri işleyen bir Web API'sı yaptım.

Entity çerçeveli bir ASP.NET Web API'sı ve bir iş birimi ve genel veri havuzu modeli. Şimdiye kadar her şey iyi.

SORUN

Yardıma ihtiyacım olduğunda API ile uygulama arasında nesne paylaşmanın etkili bir yolunu bulamıyorum.

Varlık nesnesini doğrudan serileştirmek istemiyorum, kötü bir uygulama olacağını düşündüm çünkü varlık modeli değişirse, büyük nesneleri hiçbir sebeple serileştirebilirim.

Şimdi nasıl uygulandı

Arabirim C # ASP.NET Web uygulaması ve API # C olduğundan, aralarında paylaşmak istediğim tüm sınıflarımın tanımı ile ortak bir kütüphane yaptım.

Bir android uygulaması geliştirdiğimde çözümün işe yaramayacağını biliyorum, sınıflarımı tekrar Java'da oluşturmak zorunda kalacağım, ancak bu benim en büyük sorunum değil.

Sorun şu ki, nesnelerimı her zaman dönüştürüyorum gibi hissediyorum.

MİSAL

İşte iş akışımın bir örneği:

Ben form için tüm nesneler ve veri ek açıklamaları ile bir model ile başlar sonra kullanıcı bir denetleyiciye POST POST olacaktır.

Denetleyicide bu modeli ortak kütüphanemdeki bir sınıfa dönüştürmem ve sonra bu nesneyi API'ma göndermem gerekiyor.

Daha sonra API'mdaki bir denetleyici çağrıyı yakalar ve veritabanını güncellemek için bu nesneyi bir varlık nesnesine dönüştürür.

3 dersim var

  1. Doğrulama için tüm veri ek açıklamalarına sahip görünümün modeli (İstemci)
  2. Nesneleri paylaşmak için ortak kütüphane sınıfları (DLL)
  3. Varlık sınıfları (API)

Gerçekten yanlış bir şey yaptığımı hissediyorum. Daha zarif bir şey var mı? Proje çok büyük hale gelmeden önce bu soruna iyi bir çözüm bulduğumdan emin olmak istiyorum.


Sorum net değilse soru sormaktan çekinmeyin.
Marc

Benim için hangi mimariyi uyguladığınız net değil (belki de beni şaşırtan .net ifadeleridir) - 3 katmanlı bir mimari mi: istemci, sunucu, db?
Andy

Evet Web API kullanan bir web uygulamam var. API, veritabanıyla iş mantığına sahip olanıdır.
Marc

Yanıtlar:


12

Veritabanınızdaki nesneler, veri aktarım nesneleriniz, doğrulama mantığına sahip istemci nesneleriniz arasında nesneleri sürekli olarak dönüştürdüğünüzü biliyor olabilirim, ancak hayır, hayır diyorum, yanlış bir şey yapmıyorsunuz .

Bu nesnelerin her biri aynı bilgi birimini temsil edebilir, ancak çok farklı sorumlulukları vardır. Veritabanı nesnesi, veritabanı ile iletişim arabiriminizdir ve farklı veritabanı meta veri ek açıklamalarına ve / veya içindeki veritabanı uygulamasıyla ilgili gereksiz ayrıntılara sahip olabileceğinden veya olmayabileceğinden veritabanı katmanında tutulmalıdır.

Veri aktarım nesneniz, API tüketicilerinizle iletişim arabirimidir. Farklı dillerden / platformlardan kolay tüketim sağlamak için bunlar mümkün olduğunca temiz olmalıdır. Bu, hangi API tüketicilerini desteklemek istediğinize bağlı olarak bunların nasıl göründüğü ve davranacağı konusunda bazı kısıtlamalar getirebilir.

Doğrulama mantığına sahip istemci nesneleriniz gerçekten API projenizin bir parçası değil, tüketici projenizin bir parçası. Bunlar, sunucunun hakkında hiçbir şey bilmediği (ve hakkında hiçbir şey bilmemesi gereken) ek istemciye özgü mantık (bu durumda doğrulama öznitelikleri) eklediğiniz için bu durumda veri aktarım nesneleriyle aynı olamaz. bu nesneleri API'nizin bir parçası olarak sayın, çünkü gerçekten değildirler. Son derece tüketici uygulamasına özeldirler ve API'nizi tüketen bazı uygulamaların aslında bu nesneyi oluşturması gerekmeyebilir ve sadece veri aktarım nesnelerinizde de hayatta kalabilir. Örneğin, herhangi bir doğrulama gereksiniminiz yoksa, veri aktarım nesnelerinizle tamamen aynı olan fazladan bir nesne katmanına ihtiyacınız olmaz.

Bana göre, üç nesne türünün her biri temiz kodlama ve iyi uygulama olan tek bir sorumlulukla çok güzel bir şekilde eşleşiyor gibi görünüyor. Ne yazık ki, temiz kod ve iyi uygulamalar bazen çok fazla ekstra kod yazdığınız ve "çünkü sadece" ekstra çemberlerden atladığınız anlamına gelir. Kodlama yaparken, bunun size verdiği değeri takdir etmek zor olabilir - ancak uygulamanızı bırakıp desteklemeye veya bir sonraki sürüm için yeni özellikler eklemeye başlar başlamaz muhtemelen zaman ayırdığınızı takdir etmeye başlayacaksınız. bu endişeleri ilk etapta doğru şekilde ayırın. (Sizden bahsetmiyorum bile)

Ayrıca böyle farklı nesne türleri arasında dönüşüm kodu yazmaktan nefret ediyorum, ancak benim çözümüm genellikle aşağıdakilerden biridir:

  • Nesne dönüştürme işlemlerinin çoğunu sizin için yapan bir kütüphane kullanın - örneğin, C # kullanıyorsanız, fantastik AutoMapper kütüphanesini ( http://automapper.org/ ) kullanabilirsiniz. Bunun gibi birkaç kütüphane olduğuna inanıyorum, ancak AutoMapper şimdiye kadar gördüğüm en güçlü kütüphanedir.
  • Nesne dönüşümlerinizde size yardımcı olacak bir kütüphane bulamazsanız, bunlar arasında dönüştürme için bir dizi yardımcı yöntem yazın. Bu berbat olabilir, ancak uzun vadede buna değer, bir şeyi dönüştürmek için ilk ihtiyacınız olan dönüşüm yöntemini yazın - beklemeyin.

Açıklamalarınız için teşekkür ederim ama hala bir şeyler anlamakta zorlanıyorum. Veri aktarımı katmanının neden herhangi bir doğrulaması olmadığını anlamıyorum? Bir sonraki mobil uygulamam için bazı doğrulamaları unutursam ne olur? En azından veritabanı modelimde bir istisna yapmak yerine API'yi çağırdığımda doğrulama yapmıyordu. Anladığımdan emin değilim.
Marc

1
API düzeyinde doğrulamamanız gerektiğini söylemiyorum. Dürüst olmak gerekirse, doğrulamak için en önemli yer burası. Uygulamanızda doğrulamak, kullanıcılarınızın hata yapmamalarına yardımcı olmak için "güzel bir özellik", veri aktarım nesnelerinizi doğrulamak kötü amaçlı ve hatalı verileri dışarıda tutmak içindir. Bu farklı kullanım durumları Ancak olduğundan, (farklı doğrulama çerçeveler kullanmak gerekebilir olacak (Devam uygulama ve API aynı dilde yazılmış değilse farklı doğrulama çerçeveler kullanın) ve her düzeyde biraz farklı şeyler doğrulamak olabilir . Bir sonraki yorumunda)
wasatz

1
Bu nedenle veri aktarım nesnelerinizi doğrulamanız gerekir. Ancak, bunları doğrulama şeklinizin yanlışlıkla başka bir çerçeveye bağımlılık getirmediğinden de emin olmalısınız . Ve elbette, daha önce söylediğim gibi, veri aktarım nesnelerinizin hiç doğrulandığından veya aynı çerçeve tarafından doğrulandığından emin olamazsınız - bu nedenle "iki kez doğrulamanız" gerekir.
wasatz

2
Temel olarak, uygulamanızı ve API'nizi tamamen farklı ve ayrı iki uygulama olarak görüntülemeye çalışmalısınız. Onları aynı anda geliştiriyor olabilirsiniz ve aynı görsel stüdyo çözümü / tutulma projesinde olabilirler. Ama gerçekten iki ayrı program. Başvurunuzda çalışırken, API'yı oluşturan kişi olduğunuzu "unutmaya" çalışın ve normal bir 3. taraf API ile yaptığınız gibi kullanın. Bu şekilde, API'nizi kullanırken başkalarının nasıl hissedeceğini görme ve en kötü kısımları erkenden düzeltme şansınız artar.
wasatz

1
Aynı şey, API projeniz üzerinde çalışırken de geçerlidir, birçok 3. taraf geliştiricinin kullanacağı bir hizmet yazdığınızı hayal etmeye çalışın. Mevcut uygulamanız hakkında çok fazla düşünmemeye çalışın, daha çok "hangi hizmetleri sağlıyorum?" tüm veritabanınızı silmenizi sağlar.
wasatz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.