Bugün MVC uygulamamızla ilgili ateşli bir tartışma yaptım. MVC'de ( ASP.NET ) yazılmış bir web sitemiz var ve genellikle görünümde bir şeyler yapmanın modelini izliyor -> denetleyiciye isabet et -> denetleyici bir model oluşturur (veri alan bir Yöneticisi çağırır, modeli oluşturur. denetleyici yönteminin kendisi) -> model görüntülemeye gider -> durulama ve tekrarlama.
Kurallarımızın çok sıkı bir şekilde bağlı olduğunu söyledi. Örneğin, bir masaüstü uygulamasını da istersek, mevcut kodumuzu kullanamazdık.
Söylediği çözüm ve en iyi uygulama, bir API oluşturmak ve ardından web sitenizi API'nizin üzerine koymak ve ardından bir masaüstü uygulaması, mobil uygulama vb. Oluşturmak çok basittir.
Bu, çeşitli nedenlerden dolayı bana kötü bir fikir gibi görünüyor.
Her neyse, bu uygulamayı tartışabilecek googling ile bir şey bulamıyorum. Artıları, eksileri, neden olmasın, neden olmasın ya da daha fazla okumalısın?
Bazı nedenlerin kötü bir fikir olduğunu düşünüyorum:
Arka ucunuzu bir API'den çıkarmak çok soyut. Yönetilemez bir karışıklık yaratacak kadar esnek hale getirmeye çalışıyorsunuz.
MVC'ye yerleştirilen her şey, roller ve kimlik doğrulama gibi, işe yaramaz görünüyor. Örneğin, [Yetki] özellikleri ve güvenlik; kendin yapmalısın.
Tüm API çağrılarınız ekli güvenlik bilgileri gerektirecek ve bir simge sistemi geliştirmek zorunda kalacaksınız.
Programınızın yapacağı her işlev için eksiksiz API çağrıları yazmanız gerekecek. Hemen hemen uygulamak istediğiniz her yöntemin bir API dışında bırakılması gerekir. Her kullanıcı için bir Al / Güncelle / Sil, artı her diğer işlem için bir değişken, örneğin kullanıcı adını güncelle, bir gruba kullanıcı ekle, vb. Ve her biri ayrı bir API araması olacaktır.
API'ler söz konusu olduğunda, arayüzler ve soyut sınıflar gibi her türlü aracı kaybedersiniz. WCF gibi şeyler arayüzler için çok hassas bir desteğe sahiptir.
Bir kullanıcı oluşturan veya bazı görevleri gerçekleştiren bir yönteminiz var. 50 kullanıcı oluşturmak istiyorsanız, onu 50 kez arayabilirsiniz. Bu yöntemi bir API olarak yapmaya karar verdiğinizde, yerel web sunucunuz boruları bağlayabilir ve hiçbir sorunla karşılaşmaz - masaüstü istemciniz de buna isabet edebilir, ancak birdenbire toplu kullanıcı oluşturma işleminiz, API’yi İnternet’te 50 kez kırmayı gerektirir. iyi değil. Bu nedenle toplu bir yöntem oluşturmanız gerekir, ancak gerçekten sadece masaüstü istemcileri için oluşturuyorsunuz. Bu yolla, a) API'nızı, onunla entegre olana dayanarak değiştirmek ve doğrudan onunla bütünleştirmek mümkün değildir, b) fazladan bir işlev oluşturmak için çok daha fazla iş yapın.
YAGNI . Özellikle aynı işleyen iki uygulamayı, örneğin bir web ve bir Windows uygulamasını yazmayı planlamıyorsanız, bu büyük miktarda ekstra geliştirme çalışmasıdır.
Baştan sona adım atamadığınız zaman hata ayıklama çok daha zordur.
Örneğin, bazı kodlar geçerli kullanıcıyı alabilir, kullanıcının yönetici rolünde olup olmadığını kontrol edebilir, kullanıcının ait olduğu şirketi, diğer üyelerin listesini alabilir, hepsini gönderebilir. bir e-posta. Bu çok fazla API çağrısı gerektirebilir veya ısmarlama bir yöntemle istediğiniz belirli görevi yazabilir; ısmarlama yöntemin tek yararı hız olacaktır, ancak olumsuz tarafı ise esnek olamazdı.
Muhtemelen bunların birçoğunun kafamın üstünde olmasına neden olan başka sebepler de var.
Sadece iki özdeş uygulamaya ihtiyaç duymadığınız sürece bana öyle geliyor, o zaman buna gerçekten değmez. Ben de böyle bir ASP.NET uygulaması görmedim, iki ayrı uygulama yazmanız (API ve kodunuz) ve sürümün her ikisini de kontrol etmeniz gerekir (kullanıcı sayfanız yeni bir alan alırsa, siz d Etkileyici olmamasını sağlamak için API ve tüketim kodunuzu aynı anda güncellemeniz veya sağlam kılmak için fazladan fazla çalışma yapmanız gerekir).
Düzenleme: Gerçekten tüm bunların ne anlama geldiğiyle ilgili iyi bir fikir edinmeye başlayan bazı büyük tepkiler. Öyleyse sorumu genişletmek için, bu API yapısını takip edecek bir MVC uygulamasını nasıl yapılandırırsınız?
Örneğin, bir kullanıcı hakkında bilgi görüntüleyen bir web siteniz var. MVC’de aşağıdakilere sahipsiniz:
Görünüm - (CS) Bir UserViewModel Denetleyicisini görüntüleyen HTML sayfası - GetUser () işlevini çağırır ve bir GetUser yöntemine sahip olan görünüm Yöneticisi sınıfına (API'nizin türünü) ileten bir UserViewModel oluşturur.
Denetleyici GetUser () işlevini kullanır, ancak siz de bir masaüstü uygulaması istiyorsunuz. Bu, GetUser'ınızın bir çeşit API aracılığıyla gösterilmesi gerektiği anlamına gelir. TCP bağlantısı, WCF veya belki de Uzaktan Kumanda'yı isteyebilirsiniz. Ayrıca kalıcı bağlantılar lapa lapa olduğu için RESTful olacak bir mobil uygulama da istiyorsunuz.
Öyleyse her biri için bir API, GetUser () metoduna sahip bir WCF web servisi ve kodun aynısını yazacak mısın return new UserManager().GetUser()
? Ve aynı şeyi yapan bir mvc 4 web api yöntemi? MVC denetleyici yönteminizde GetUser'ı doğrudan aramaya devam ederken mi?
Veya üçünün de (web api REST servisi) işe yarayacak çözümü seçip bunun üzerine her şeyi inşa edersiniz, böylece üç uygulama da API çağrıları yapar (mvc olanlar, yerel makineye).
Ve bu sadece teorik mükemmel bir senaryo mu? Bu yolun geliştirilmesinde büyük genel giderler görebiliyorum, özellikle de işlemlerinizi RESTful olarak yapmanıza izin verecek şekilde geliştirmek zorundaysanız. Bunun bir kısmının cevaplarda ele alındığını düşünüyorum.
Düzenleme 2: Daha fazla şey okuduktan sonra, aşağıda açıklayabileceğimi düşündüğüm bir yorum yaptım. Soru, sanırım biraz hileli bir soru. Bir API olarak arka uçunuzu yazmanız durumunda kafam karıştı, her şeyin (mvc uygulaması, masaüstü uygulaması, mobil uygulaması) bir şeyler yapmak için çağırdığı tek bir web hizmeti olması gerektiğini düşünüyorum.
Geldiğim sonuç, gerçekten yapmanız gereken şeyin iş mantığı katmanınızın doğru bir şekilde ayrıldığından emin olmak olduğu. Koduma bakarken, bunu zaten yapıyorum - denetleyici GetUser()
bir yöneticiyi arayacak ve daha sonra bir Görünüm ile işlemek için bir görünüm modeli oluşturacaktır. Yani gerçekten, iş mantığı katmanı olan bir API. Ancak bir masaüstü uygulamasından aramak istiyorsanız, aramayı kolaylaştırmak için bir WCF servisi gibi bir şey yazmanız gerekir. Sadece GetUser()
kodu içeren denilen bir WCF yöntemine sahip olmak bile return MyBusinessLayer.GetUser()
yeterli olacaktır. Bu yüzden API, iş mantığıdır ve WCF / web api vb. Harici uygulamaların çağırmasına izin veren kodun sadece bir kısmıdır.
Dolayısıyla, bazı ek yükler vardır, ihtiyaç duyduğunuza bağlı olarak iş mantığı katmanınızı farklı API'lere sarmanız ve diğer uygulamalarınızın yapmasını istediğiniz her işlem için bir API yöntemi yazmanız gerekecek, artı yapmanız gerekecek. kimlik doğrulama yapmak için bir yol ayırın, ancak çoğunlukla aynıdır. İş mantığınızı ayrı bir projeye dahil edin (sınıf kütüphanesi) ve muhtemelen sorun yaşamayacaksınız!
Umarım bu yorum doğrudur. Ürettiği tüm tartışma / yorumlar için teşekkür ederiz.