.NET uygulamaları arasında kod paylaşmanın en etkili yolu nedir?


15

Çalışmalarımızda, birçok temel işlevselliği paylaşan birkaç farklı .net uygulamamız var. Bu uygulamaları temiz n katmanlı bir mimari kullanarak yaptık, ancak aynı işlevleri birkaç farklı kez yeniden uyguladığımızı anladığımız anı vurduk. Açıkçası bu DRY'yi ihlal ediyor ve bunu düzeltmek istiyoruz. Nuget'i zaten yaygın tutkal kodu (IoC, günlük kaydı, ayarlar) için bazı başarılarda kullanmaktayız, ancak aynı zamanda veri ve iş katmanlarımızı tüm uygulamalarımız arasında paylaşmak istiyoruz. Fikir, UI'nin sadece iş katmanının gerçekten ihtiyaç duyduğu bölümleri ele alacağıdır.

Bu başlangıçta basit bir sorun gibi görünüyor, ancak devam eden gelişme bazı tuzaklar sağlayabilir ve nasıl ilerleyeceğimizden emin değiliz. Diyelim ki Tek İşletme Katmanımızı Hepsini Yönetmek İçin Yapıyoruz. Kısacası ben buna "Vakıf" diyeceğim. Vakfı kullanmak için uygulamalarımızı taşıyoruz ve her şey harika çalışıyor. Vakıf, hafif UI katmanlarına nuget yoluyla dağıtılır ve iyi görünüyoruz. Ama sonra uygulamalarımıza özellikler eklemeye başlıyoruz ve başımız belada.

Diyelim ki A Projesi üzerinde çalışıyoruz ve Vakıfta değişiklik gerektiren yeni bir özellik ekliyoruz. Vakfta (Vakıf-A) değişiklikler yaparız ve kararsız bir paket olarak nuget yemine göndeririz. A Projesi en son nuget paketini alıyor ve her şey yolunda. Bu arada, başka bir geliştirici Proje B üzerinde çalışıyor. En son Vakfı kaynak kontrolünden alıyor, ancak istikrarlı bir daldan alıyor, böylece Proje A'da değişiklik yok. Değişiklikler yaparak Vakıf-B'yi yarattı. Ve her şey yolunda. Ancak daha sonra, aslında kodu paylaşabilecek olan Foundation-A ve Foundation-B uygulama işlevlerini keşfediyoruz, bu yüzden bunları birleştiriyoruz. Bu arada Foundation-C kendi değişiklikleriyle yüzüyor. Sonunda, Foundation-B üretime hazırdır, bu yüzden onu dışarı çıkarıyoruz. Ama sonra Üretim A, B'yi güncellemeliyiz,

Bu işe yarayabilir gibi görünüyor, ancak farklı veritabanı şemalarıyla çalışmaktan ve Vakıf veri havuzunun çeşitli dalları ile Proje A, B ve C depoları arasında her şeyi senkronize tutmak konusunda endişeliyiz. Muhtemelen hata olasılığını açan çok fazla manuel çalışma alacak gibi görünüyor. Bunu olabildiğince otomatik olarak istiyorum.

İşte kullandığımız yığın: C #, Sürekli Entegrasyonlu TFS, Nuget. Uygulamalarımız çeşitli ASP.NET uygulamalarıdır. İşleri kolaylaştıracaksa farklı SCM'lere bakmaya hazırız.

Farklı kaynak kodu şubelerimizle Nuget aklı başında tutmanın yollarını arıyorum. Yanlış Nuget Paketine referans verdiğimiz için geliştirme kodunu yanlışlıkla üretime sokmak istemiyoruz.


Ayrıca, eğer böyle bir tartışma için iyi bir forum değilse, birisi daha iyi bir tartışma önerebilir mi?
Josh

Yanıtlar:


9

Vakfta (Vakıf-A) değişiklikler yaparız ve kararsız bir paket olarak nuget yemine göndeririz.

İşte sorun burada başlıyor ... Bunu yapma.

Foundation v1.0'daki herhangi bir değişiklik, doğal olarak tüm Foundation tüketicileri için değerli olmalıdır, aksi takdirde Foundation'a ait değildir. Yani, nuget paketini oluştururken, vakfın resmi, istikrarlı bir versiyonu (yani v1.1) olarak yapın ya da hiç yapmayın.

Proje B, Temel geliştirmelerini normalde olduğu gibi inşa etmelidir, ancak (iyi kaynak yönetimi tarzında) istikrarlı bir Temel (v1.2) nugete itmeden önce gövde değişikliklerinde (v1.1) birleşmelidir.

Temel geliştirmelerini kullanabilen diğer projeler, uygun olduğunda nuget referanslarını yükseltebilir veya gerekirse eski sürümlere sadık kalabilir.

@Giedrius'a katılıyorum ; bana göre bu, vakfın dallanması / birleştirilmesi düzgün bir şekilde ele alınırsa, paket yönetimi sorunlarının tartışılması anlamında bir kaynak kontrolü / dallanma sorunu gibi görünüyor.


Evet, bu mantıklı. Sorun pratik uygulamada. V1.1 için Foundation güncellemelerini yaparken, Proje B'deki değişiklikleri geliştirirken kullanmak istiyorsunuz. Bu kodu paylaşma şekliniz nuget üzerinden ise, seçenekleriniz şunlardır: 1) Yeni nuget paketi yayınlayın veya 2) dll'leri el ile kopyalayın. Bunların hiçbiri iyi seçimler gibi görünmüyor.
Josh

Bunlardan bazıları etkili bir test paketine sahip olarak hafifletilebilir, ancak özellikler ekledikçe hala ileri geri gidecektir.
Josh

@Josh Evet, B Vakfı'nın güncellemelerinin B Projesi'nin bunları nasıl kullanacağından bağımsız ve tam olarak test edilebilir olması gerekir (ortak bir kütüphaneye gittiklerinden beri), bu yüzden 'yeni nuget paketi yayınla' doğal yoludur. Nuget'te kararlı bir paket olana kadar Project B'de Foundation v.Next'i içe aktarmayın ve kullanmayın. Biraz disiplin gerektiriyor, ancak bunu yapmanın karmaşasından çok daha iyi.
Eric King

1
Ne dediğini tamamen anlıyorum, ama bunun çok gerçekçi olduğunu düşünmüyorum. Bir özelliği geliştirdikçe, tüm iş mantığı ve veri erişim katmanı tamamen test edilmiş olsa bile, üretime geçmeden önce bir değişiklik olacaktır. Belki de iş mantığına başka bir mülk eklemeniz gerektiğini veya ürün sahibinin değişiklik veya açıklamalarla geri geldiğini fark ediyorsunuz. Belki basitleştirici varsayımlarınızdan bazıları yanlıştı. Bunlar her zaman olan şeyler. Temel mantığınızın kilitlenmesiyle sınırlıysanız, gerçekten çok sınırlı görünüyor.
Josh

2
Bunu birkaç aydır sürdürdüğümüz için, temelde yerleştiğimiz şey budur. Bence resmi bir sürece sahip olmaktan çok endişelendim. Aslında üzerinde çalışmaya başladığımızda, işler gerçekten sorunsuz gitti. Girdiniz için teşekkürler.
Josh

4

Yinelenen kodunuzu daha soyut bir şekilde uygulanabilir işlevlere yeniden düzenleyin ve bunları kendi kitaplıklarına veya çerçevelerine yerleştirin. Onları gevşek bir şekilde birleştirin ve mimari olarak agnostik hale getirin ve hiçbir zaman problem yaşamamalısınız. İlham almanız gerekiyorsa, .NET framework'ün arayüzler, jenerikler ve yazılım desenleri gibi şeyleri kullanarak kavramları nasıl soyutladığını inceleyin Dispose().

Ayrıca, tüm yinelenen kodların gerçekten çoğaltılmadığını unutmayın; bazıları mimariyi sürdürmek için gerekli olan tutkal kodu veya koddur, bu yüzden çok KURU olmak konusunda takıntılı olmayın.


Belki de sorumda olabildiğince net değildim. Bu sırada gelecek olanlarla ilgilidir. Tüm bunları yaptınız ve şimdi kodunuzu farklı projeleriniz arasında etkili bir şekilde paylaşmanız gerekiyor. Birisi "sadece bunun için nuget kullan" diyor ve ayrıntılara girip farklı dallardan ve uygulamalardan farklı değişikliklerin nasıl senkronize edileceği gibi sorunlara girene kadar harika görünüyor.
Josh

Eric King ile hemfikirim. Temel kod kararsız değil sabit bir sürüm olarak kullanılmalıdır. Anahtar istikrarlı bir API korumaktır: kuruluş yöntemlerinizin imzalarının değişmeyeceğini biliyorsanız, yöntemleri güvenli bir şekilde Vakfa itebilir ve daha sonra hiçbir şey kırmadan bunları yeniden düzenleyebilirsiniz.
Robert Harvey

4

Kodun Yeniden Kullanımı

Kodların yeniden kullanımı konusunda yıllar içinde iyilik bulan birkaç yaklaşım vardır. Her yaklaşımın yeri ve daha da önemlisi sorunları vardır , ancak .NET'te kodu yeniden kullanmanın geçerli yolları şunlardır:

  1. Ortak Kütüphane. Birden fazla yerde gerekli olan kod ortak bir kütüphaneye konur ve kod tabanının diğer tüm bölümleri bu koda tek bir referansa sahiptir. İlke dezavantajı, ilgisiz birçok işlev içeren bu kütüphaneye bağlı olarak projenizin çoğuyla sonuçlanmanızdır. Bu, kalite güvencesi açısından kötü bir fikirdir.

  2. Ortak Kaynak Kodu. Birden fazla yerde gerekli olan kod bir kez yazılır ve ortak bir dizin yapısında bir kaynak dosyasına yerleştirilir. Bu koda ihtiyaç duyan tüm projeler bu dosyayı kaynak dosyalarından biri olarak içerir. Bu, kodun yeniden kullanılmasını sağlar ve bir kez yazmanın avantajlarını çok kullanır. Ancak. Bunun dezavantajı, projenin farklı bölümlerinin bu kodun farklı sürümleriyle derlenmesinin mümkün olmasıdır - bu, kalite güvencesiyle tespit edilmesi ve tanımlanması çok zor olabilecek bazı ince kusurları ortaya çıkarabilir.

  3. Hizmet. Ortak kod, diğer yönlerin erişebileceği bir hizmet olarak uygulanır. Bunun, bir dağıtımda tek bir hizmet olacağı ve bağımlılıklardan kaçınacağı avantajı vardır. Ancak gecikme ve başarısızlıkları beraberinde getirecektir. Bu tür bir yaklaşım, yüksek kullanılabilirlik ve hata toleransının zaten anlaşıldığı ve yönetildiği büyük dağıtılmış ürünlerde iyi çalışır.

NuGET'i Yönetme

Burada çok daha ilginç bir problem var. Birden fazla yapılandırmayı yönetme. Buradaki tavsiyem, farklı kod sürümlerine sahip farklı bir müşteri tabanını değil, yapılandırma dosyalarıyla yönetmektir. Yönetilecek en az 3 yapılandırma verisi katmanı vardır. Müşterinin hiç görmediği temel (dahili) ürün yapılandırması. Müşterinizin değiştirebileceği varsayılan yapılandırma seçenekleri ve müşterinizin değiştirdiği yapılandırma seçeneklerinin son katmanı. Bu farklı katmanları ayırarak, müşterilerinizin yapılandırmalarını yok etmeden yükseltmeleri kullanıma sunabilirsiniz.


1

Bence sorun nuget / kaynak kontrolü / dallanma değil, yapıştırıcı koduna kaymaktadır.

Robert'in tüm resmi görmek için güzel bir cevabı var, bu ortak yardımcı programların her projeye hangi bağımlılıkları getireceğini düşünmenizi tavsiye ederim:

http://ayende.com/blog/3986/let-us-burn-all-those-pesky-util-common-libraries http://blog.jordanterrell.com/post/CommonUtility-Libraries-Dead.aspx

Sahip olduğunuz cehennemden kaçınmanın en iyi yolu tutkal kodunuzu açık kaynak yapmaktır. Bu şekilde, hiçbir iş mantığının halka açılmayacağına, beton proje bağımlılıklarının tutkal koduna girmeyeceğine, şirketiniz dışında bile herhangi biri tarafından tekrar kullanılacak kadar soyut olacağına ve bu yapıştırmanın kodu yeterince iyi olacak - topluluk girdisini de alacaksınız.


Tutkal kodunu yönetmekten bahsetmiyorum. Bunun için zaten bir çözümümüz var ve iyi çalışıyor. İş mantığını paylaşmaktan bahsediyorum. Örneğin, uygulamalarımız yönetim organizasyonları ve insanlar ile ilgileniyor. bir kişi oluşturmak ve bir kişinin nasıl oluşturulması gerektiğiyle ilgili bir sürü iş kuralı var.Bunu birkaç kez oluşturmak yerine, nesneyi inşa etmekten farklı projeler arasında paylaştığımız ısrar etmeye kadar her şeyi ele alan bir pakete sahip olmak istiyoruz. yaratması gereken insanlar
Josh

0

Çözüm basit: bunun için ayrı bir proje oluşturun ve ayrı bir şey olarak yönetin: kendi gereksinimleri, test, sözleşmeler, dokümantasyon, planlama, insanlar, vb. Bu şekilde, kalitenin yüksek kalmasını ve olası kırılma değişikliklerinin elde edilmesini sağlarsınız. bir sorun yaratmadan önce değerlendirildi.

Ya da daha iyisi: bunu kuruluşunuz içinde "açık kaynak" yapın. Böylece herkes kodu değiştirebilir, ancak seçilen birkaç kişi tam taahhüt haklarına sahip olacaktır. Ve bu insanlar kalite ve doğru özellikleri sağlamaktan sorumlu olacaklar.

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.