Harika soru! Projelerimi yapılandırmak için her zaman daha iyi bir yol arıyorum. Aldığınız her noktaya değinmek ve çeşitli çözüm yapılarını araştırmak, burada yorumların çoğunluğunu kabul ettiğimi söylemek zorundayım: mükemmel bir çözüm yok. Bu tür bir sorunla karşılaştığınızda kendinize sormanız gereken birkaç şey: Bu uygulama ne kadar karmaşık? Ne kadar sistemle entegrasyona ihtiyacım olacak - veya bu sisteme ne kadar sistem entegre etmek gerekecek? Ne kadar test yapmayı planlıyorum? Ayrı bir tasarım / UI ekibi var mı? Ölçeklememiz gerekecek mi? Bir oturumu ne oluşturur?
Bazı senaryolara ve olayların gerçekten çarpışması için biraz zekice bir mühendislik kullanmanın yollarını ve bazı şeyleri biraz daha kolaylaştırmak için bazı hilelere bakalım.
Hem API hem de Web Sitesini Aynı Projede Barındırma
Bu durumda, sıfır veya daha fazla iş katmanı projesi ve tek bir hibrit MVC / WebAPI projesi (ve diğer projeler - yardımcı program, vb.) İle tek bir çözümünüz olabilir.
Pro'nun
Her şeyi tek bir yerde .. Karmaşık mesajlaşmada ayakkabı kornasına gerek yok (HttpClient çağrıları), paylaşılan oturum durumunu (çerezler üzerinden istemci ve sunucu, InProc / OutOfProc oturumu vb.), Bağlantı havuzu oluşturma, paylaşılan mantık vb. Dağıtım daha kolay olamazdı.
Con'ın
Her Şey tek bir yerde .. Bu muhtemelen mümkün olan en monolitik yapıdır. Senin katmanları arasında tanımlanmış arayüzler hiçbir açıkça vardır .. Sen ile bitirmek yüksek uyum . Tembel geliştiriciler, test etmeyi çok büyük bir acı kılan bu tür mimariyle uğraşırken arayüzlerden kaçınırlar. Uygulamanın ölçeklendirilmesi / birlikte konumlandırılması zor olacaktır.
Kullanım Alanları
Bu proje yapısını bir kereye mahsus, dahili veya basit bir uygulama için kullanırdım. Yerel Y'de basketbol kampına kaydolmayı izlemek için hızlı bir sistem kurmak? Bu senin mimarın!
WebAPI ve Farklı Projelerde Web Sitesi
Bu durumu tercih etme eğilimindeyim. Bir (veya daha fazla) MVC projesi ve bir WebAPI projesi ile tek bir çözümünüz var.
Pro'nun
Modülerleşmesi! Gevşek kavrama! Her proje tek başına durabilir, ayrı ayrı test edilebilir ve farklı şekilde yönetilebilir. Bu, gereksinimlerinize bağlı olarak farklı önbellekleme stratejilerini daha kolay uygulamanıza olanak tanır. Farklı sistemleriniz arasında sağlam sınırları koruyarak, belirli kullanım modellerini uygulamanıza ve olası sürtünmeyi azaltmanıza olanak tanıyan sözleşmeleri daha kolay oluşturabilirsiniz (okuma: API'yi kötüye kullanma imkanı daha az hatayla). Ölçekleme biraz daha kolaydır, çünkü yalnızca yüksek yük gören bitleri ölçeklendirmeniz gerekir. Entegrasyon da işlemek için biraz daha kolay hale geliyor, çünkü API'nizin neye benzeyeceği hakkında bir fikriniz olması gerekiyor.
Con'ın
Bakımı biraz daha zor. Vb birleştirme, sözleşmeler (arayüzler), dağıtımlar, Kod bakım, takip etmek, proje / özellik sahiplerini gerekecektir Çoklu projeler vasıtası teknik borç , hata izleme, devlet yönetimi - onlar gerekebilir gibi tüm haline kaygıları farklı uygulanır dayalı olması ihtiyaçlarınız üzerine. Bu tür uygulamalar aynı zamanda büyüdükçe en fazla planlama ve iyileştirme gerektirir.
Kullanım Alanları
Bugün 100 kullanıcısı ve gelecek hafta / ay 100.000 olabilecek bir uygulama oluşturmak? Uygulama bildirim göndermek, karmaşık iş akışlarını yönetmek ve birden fazla arayüze sahip olmak zorunda mı (web + mobil uygulama + SharePoint)? Elleriniz üzerinde çok zamanınız var ve hafta sonu boyunca 5000'den fazla parça bulmacayı çözmeyi seviyor musunuz? Bu sizin için mimarlık!
İpuçları
Yukarıdakileri ana hatlarıyla belirledikten sonra, bir sonraki projenizin biraz korkutucu görünebileceğini anlayabilirim. Endişeye gerek yok, işte yıllar boyunca öğrendiğim birkaç püf noktası.
- Vatansız oturumları kullanmaya çalışın. Daha küçük sistemlerde bu, en azından geçerli kullanıcının dahili kimliğini ve zaman aşımını içeren şifreli bir çerezin saklanması anlamına gelebilir. Daha büyük sistemler, bir veri deposundan (redis, tablo saklama, DHT , vb.) Alınabilecek basit bir oturum kimliğine sahip şifreli bir çerez saklamak anlamına gelebilir . Ana veritabanına gitmek zorunda kalmayacak kadar bilgi saklayabilirseniz Her istek üzerine o zaman iyi bir yerdesiniz - ancak çerezleri 1k altında tutmaya çalışın.
- Birden fazla modelin olacağının farkında olun. Modeller ve projeksiyonlar açısından düşünmeye çalışın (burada bulduğum bağlantılar .. iyi değildi .. düşünün: bir erkeğin envanter kalemi başka bir erkeğin sipariş satır öğesidir - aynı temel yapı, ama farklı görüşler). Bazı projeler, her bir mantıksal / kavramsal sınır için farklı bir modele sahiptir (örneğin, belirli bir API ile iletişim için belirli bir model kullanma).
- API's Her Yerde! Bir nesne / sınıf / yapı herhangi bir veri veya davranışı ortaya çıkardığında, bir API oluşturuyorsunuz. Diğer API'lerin veya bağımlılıkların bu API'yi nasıl kullanacağına dikkat edin. Bu API'yi nasıl test edebileceğinizi düşünün. Bu API ile ne konuşabileceğinizi (kod ile diğer nesneler? Protokol ile diğer sistemler?) Ve bu verilerin nasıl ortaya çıktığını (güçlü bir şekilde yazılmış? JSON? * Öksürük * XML?) Düşünün.
- Sahip olduğun şeyleri inşa et, bundan iki yıl sonraya kadar sahip olacağın hayallerini değil. Başka bir cevap YAGNI'ye atıfta bulunuyor - kesinlikle haklılar ! Hayali problemleri çözmek, teslim tarihinizi hayali kılar. Yinelemeleriniz için sağlam hedefler belirleyin ve onlarla tanışın. Dağıtmak! Geliştirme aşamasındaki bir proje, tek kullanıcılı bir projedir - siz!
- YMMV (Kilometreniz Değişebilir). Burada mutlak olan tek bir şey var: bir sorun var, bir çözüm üretiyorsunuz. Her şey tamamen havada. Yukarıdaki her iki çözüm de vahşi bir başarı haline getirilebilir - ve emme hatası. Hepsi size, araçlarınıza ve bunları nasıl kullandığınıza bağlı. Hafifçe bas, dost geliştirici!