Visual Studio Solutions için iyi uygulama [kapalı]


10

Umarım görelilik basit bir soru. Binalarda onarılan cihazların izlenebilirliğini sağlamak için yeni bir dahili proje üzerinde çalışmaya başlıyorum.

Veritabanı bir web sunucusunda uzaktan depolanır ve bu bilgilere web API (JSON çıkışı) üzerinden erişilir ve OAuth ile korunur. Ön uç GUI WPF'de ve iş kodu C #'da yapılıyor.

Bundan farklı katmanları görüyorum Sunum / Uygulama / Veri Mağazası. API'ye yapılan tüm kimliği doğrulanmış çağrıları yönetmek için kod, varlıkları temsil etmek için sınıf (iş nesneleri), varlıkları oluşturmak için sınıflar (iş nesneleri), WPF GUI için parçalar, WPF görünüm modellerinin parçaları vb.

Bunu tek bir projede oluşturmak veya bunları bireysel projelere ayırmak en iyisidir?

Kalbimde bunun birden çok proje olması gerektiğini söylüyorum. Daha önce her iki şekilde de yaptım ve tek bir proje çözümü ile testin daha kolay olduğunu gördüm, ancak birden fazla proje ile özyinelemeli bağımlılıklar ortaya çıkabilir. Özellikle sınıfların test etmeyi kolaylaştırmak için arayüzleri olduğunda, işlerin garip olabileceğini buldum.


1
Onları proje için anlamlı olan şeylere ayırırdım.
Ramhound

MattDavey'nin önerdiği gibi arayüzleri tutmak için bir proje üzerinde başka kimsenin düşüncesi var mı? Bahsedilen bağımlılıkları önlemek için bu yaklaşımı daha önce kullandım. Ya da x sınıfı arabirimleri, x sınıfı ile aynı projede yer almalıdır.
JonWillis

Ayrıca, hepiniz hangi katmanları kullanırsınız. Başlıca Sunum / Uygulama / Altyapı olmasına rağmen birkaç farklı varyasyon gördüm. Bazıları uygulamayı 2 parçaya ayırır, uygulama + hizmet. Bazı modeller, iş mantığı için bana iş nesnelerinin içine dahil edilebilecek belirli bir katmandan da bahsediyor.
JonWillis

Yanıtlar:


8

Projenin büyüklüğüne bağlıdır

İşte kullanmaya meyilli olduğum yönergeler

  • Bir avuç sayfa veya daha az olan küçük bir proje neredeyse her zaman tek bir projeye devam ediyorum.

  • Küçük projenin Veri Erişimi katmanı büyük veya karmaşıksa, bunu kendi katmanına ayırabilirim, ancak aksi takdirde sadece kendi klasöründe oturur.

  • Proje daha büyükse, neredeyse her zaman DAL için ayrı bir projem olacak ve daha fazla bölünme, uygulamanın işlevselliği arasındaki sınırların nereye bağlı olduğuna bağlı.

  • Uygulamanın birden fazla amacı varsa, her biri kendi görünümüne, görünüm modellerine vb.Genel olarak her parçayı kendi alanına ayırırım. Her bölüm küçükse, onları bir Klasör ile ayırırım. Her bölüm büyükse, onları bir projeyle ayıracağım.

  • Ben nesnelerin (aynı seti başvurmak gerekir çoklu projeleri varsa ViewModelBase, RelayCommandvs.), sadece paylaşılan altyapı nesneler için bir proje oluşturacağız.

  • Çok sayıda paylaşılan özel stil / şablon / kaynak varsa, sadece bunlar için bir proje oluşturacağım.

Bir yan not olarak, ilk büyük WPF projemle ilgili bir hata yaptım ve Modelleri bir projeye, başka bir görünümdeki Görünümlere ve üçüncüsü de ViewModels'e koyarak onları ayırdım. Şimdi size söyleyebilirim ki, bakım bir kabus haline geldiğinden, gitmenin yolu bu değildir :)


Merakla, katmanları ayırarak hangi bakım sorunlarınız oldu?
Ian

@Rachel, WPF kullanacağım. Böylece projeyi nasıl organize ettiğinizi bilmek ister misiniz? Ben 3 dll 3 parçalara ayırırken küçük bir MVC projesi bir ağrı olduğunu hatırlıyorum düşünüyorum. WPF için, Benim görüşüm GUI, değiştirilecek varlık / iş nesnesi ve ViewModel arasındaki etkileşim olacaktır. ViewModel, onarımları yüklemek / kaydetmek için bir depo çağırma mantığıyla ilgilenir (bu da fabrikalar / web apisleri vb.).
JonWillis

1
@Ian En büyük sorun, tek bir alan eklemek gibi çoğu küçük değişikliğin Model, View, ViewModel ve DAL'ı 4 ayrı kütüphanede bulmamı gerektirmesiydi. O sırada çalıştığım proje oldukça büyüktü ve belirli dosyaları aramayı umduğumdan daha fazla zaman harcadım. O zamandan beri bu kadar örnek şey gibi ara-İlgili için birlikte ilgili nesneleri tutmaya değiştirdik SearchView, SearchViewModelve SearchResultModeltüm bir klasörde gruplanmış olacak ve bunu korumak için uygulamanızın kolaylaştırdığı tespit ettik.
Rachel

Ayrıca, bağımlılık sorunları yaşadığımı ve dairesel referanslar halinde çalıştığımı da hatırlıyorum, çünkü en iyi çabalarıma rağmen bazı katmanların başkalarına başvurması gerekiyordu, ancak bu katman onlara atıfta bulundu, bu yüzden yeniden düzenlenene kadar bazı çirkin geçici çözümler vardı
Rachel

1
@JonWillis WPF projelerimin çoğu cevabımda belirtilen noktalara dayanarak dağılmış durumda. Genellikle DAL kendi katmanıdır ve projenin her Modülü veya Bölümü birlikte gruplandırılır (projenin boyutuna bağlı olarak kendi klasöründe, ad alanında veya projesinde). Örneğin, Interfaceveri katmanı için de dahil olmak üzere tüm Arama Nesneleri birlikte olacaktır , ancak Arama için gerçek veri erişim katmanı DAL kitaplığında olacaktır. Sıklıkla ortak temel sınıfları, arayüzleri ve yardımcı sınıfları içeren bir Infrastructureveya Commonkütüphanem var.
Rachel

14

Katman başına bir proje ve katman başına bir test projesi ile en iyi sonuçları gördüm. Çözümün her şeyi kapsadığı 10 veya daha az projede gerçekleştirilemeyen az sayıda uygulama gördüm .

Gerçekten ad alanı oluşturmak istediğiniz projeleri kullanma tuzağına düşmeyin. Tonlarca proje kazanç elde etmek için ek yükten başka bir şey eklemiyor.


9

IMHO ayrı neredeyse her zaman daha iyidir. Proje% 100 önemsiz olmadığı sürece veri katmanımı neredeyse her zaman ayırıyorum. Bunun nedeni, veri katmanının en sık geçirilme eğiliminde olmasıdır. Nadiren bir GUI'yi birden çok veri katmanına bağlar ve iyi çalışmasını beklersiniz. Çok daha yaygın senaryo, tek bir veri katmanına sahip olmanız ve bunun birden çok GUI'ye (ASP.Net, WPF ve örneğin bir Silverlight uygulaması) dağıtılmasını istemenizdir. Sadece veri katmanı projesi oluşturmak ve bu dll inşa sonraki GUI bir referans olarak koymak harika.


+1 Yeni projelere başlarken sıklıkla verileri bellekte tutan simüle edilmiş bir veri katmanı oluştururum. İlk önce uygulamanın geri kalanını oluşturmakla başlamamı sağlar. Sonra daha sonra bir "gerçek" veri erişim katmanı için takas edebilirsiniz ..
MattDavey

Web sunucusuyla iletişim kurmak için kullanılan varlıkları (DTO), factorys ve sınıfları veri katmanının bir parçası olarak düşünür müsünüz?
JonWillis

@JonWillis - Hayır, muhtemelen hepsi bu değil. Web sunucusu için fabrikaları ve sınıfları bir sınıf kütüphanesi projesinin ad alanına koyardım. Tipik veri katmanım gerekli dbml dosyaları ve / veya edmx dosyalarından başka bir şey içermiyor. Ancak, kural olarak, "kütüphane / çerçeve" şeyler kendi proje vermek. İnsanların bunu her zaman yaptığını görmeme rağmen, GUI projesine kesinlikle atılmaları gerekmiyor.
Morgan Herlocker

Gerçekçi olmakla birlikte, birkaç ad alanı almanız ve bunları yeni bir projeye ayırmanız ne kadar sürer? Oldukça kolay bir yeniden düzenleme işi olduğunu hissediyorum.
Didier A.

4

Benim için, 4 * sihirli sayıdır. Her katman için bir proje ve aralarında iletişim kurmak için gereken tüm arayüzleri / DTO'ları tanımlayan bir proje.

* 7 birim testi sayıyorsanız


2

Bu farklı katmanlar üzerinde çalışıyorsam veya onlarla sıkı bağlantı varsa her zaman tek bir çözüm kullandım. F5'e basmak ve gerekirse tüm projelerin yeniden oluşturulmasını istiyorum. Bunu yapmanın "doğru" bir yolu olduğunu düşünmüyorum.


2

Kişisel tadı, en önemli şey tutarlı olmaktır . Şahsen uygulamanın her katmanı için ayrı bir proje var, bu yüzden ayırma açıktır.


Hangi katmanlara ayırıyorsunuz? Ayrı Uygulama / Hizmetler katmanlarınız var mı ve eğer varsa bunlar gerçekten nasıl farklılık gösterir. İş mantığınız uygulama / hizmet içinde mi, yoksa asıl iş nesneleri üzerindeki yöntemler mi?
JonWillis

1

Proje sayısındaki artış, birim testini etkinleştirmek ve bağımlılık grafiğini, işlerin o kadar karmaşık olmadığı noktaya kadar basitleştirmekle ilgilidir; uygulamanın bir bölümündeki değişiklikler, uygulamanın görünüşte ilgisiz kısımlarındaki işleri bozar.

Tüm "sözleşmeleri", arayüzleri, soyut sınıfları, veri aktarım nesnelerini tek bir montaj içine koymak için bir çeşit bağımlılık tersine çevirme yaptığımda işe yarar. Başka bir mecliste veri tabanına konuşan her şeyi koydum. Birim testleri kendi montajlarını yapar. Kullanıcı arayüzü temel olarak test edilemiyorsa (örn. ASP.NET winforms), kullanıcı arayüzünü test edilebilir koda ve test edilemeyen koda (her biri bir montaj) bölmenin önemli bir yararı vardır. Bazen veritabanı, kullanıcı arayüzü veya şimdiye kadar bahsettiğim herhangi bir şeyle ilgisi olmayan bazı kodlar ortaya çıkmaya başlar. Bu kod bir altyapı montajına koyacağım ya da en azından kök montajı ne olursa olsun koyacağım (muhtemelen arayüzlere sahip olan).

Tüm montajlar tüm montajları referans alıyorsa veya neredeyse böyle olursa, tek bir montajda birleştirilmeleri gerekir. Siz veya ekibinizdeki kişiler veri katmanı kodunu kullanıcı katmanına ve kullanıcı arayüzüne veri katmanında koymaktan kaçınacak disiplinden yoksunsa, hepsini tek bir katmanda birleştirerek işleri basitleştirin.

Visual Studio'nun bazı sürümleri yaklaşık 15 derlemede performans sorunlarıyla karşılaşır, bazen ne tür bir projenin olduğuna bağlıdır. Stratejik olarak boşaltma proje dosyaları bazen yardımcı olabilir.


Şu anda şirketteki tek geliştiriciyim. Ve aynı zamanda üniversite dışında taze, bu yüzden en kısa sürede daha büyük projelerde iyi uygulamalar aşılamaya çalışıyoruz. Sistemin en kısa sürede istenmesine yönelik isteklere karşı, belgeyi belgelemeye başlamadan önce sistem özellikleri çok değiştiğinden, bakımı sürdürülebilir hale getirmekle ilgileniyorum. Sizce sadece arayüzleri içeren bir montaj uygun bir çözüm olabilir mi? Bu şekilde bağımlılık sadece arayüzlere ve fabrika sınıflarına olmalıdır.
JonWillis

1
Evet. Montajın bölünmesinin motivasyonunu anlamak daha iyidir, ancak siz (veya ekip üyeleriniz) bunu yapmazsanız, hala ucuz bir manevra. Bu yüzden, tüm montajlara bağlı tüm montajlarla sonuçlansanız ve ünite testi umudunuz olmasa bile, sözleşmeler (arayüzler, soyut sınıflar) gibi davranan şeyleri kendi montajlarına taşımak, doğru yönde atılmış bir adımdır ve birkaç dezavantajı vardır.
MatthewMartin

-2

Birden fazla projeye sahip olmanın tek iyi nedeni, bir dizi sınıfı ve dosyayı birden fazla uygulamada paylaşmanız gerektiğidir.

Projeler sadece bir uygulama tarafından kullanılıyorsa, ilk etapta yapılmamalıdır. Bunun yerine ad alanlarını kullanın. Dosyaları ararken dairesel referanslar, dll yükü ve proje karışıklığı kendinizi kaydedin.

Neden böyle olduğunu daha iyi açıklamak için bu makaleyi okuyun: http://lostechies.com/chadmyers/2008/07/16/project-anti-pattern-many-projects-in-a-visual-studio- çözelti-dosya /

Ve makalede belirtildiği gibi, bana ne olduğunu söylemek için uygulama genelinde kod paylaşımı dışında birden fazla proje olması için geçerli bir nedeni olan herkesi memnuniyetle karşılarım, çünkü herhangi bir şüpheliyim.


Downvote üzerine Karşı Tartışmalar takdir edilecektir.
Didier
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.