Sınıfları veya arayüzleri farklı projeler arasında paylaşma


17

SO'da veya burada bazı cevaplar arıyordum, ancak sonuç olmadan, bu yüzden size soracağım.

Varsayalım ki iki farklı projem var - örneğin sunucu bölümü ve uygulamanın istemci bölümü. Kendi rolümü geliştiriyorum, arkadaşım ikincisini yaparken. Ama ikimiz de bir uyumluluk sağlamak için veya ... Userya AccountInfoda ChangableAccount... gibi ortak arayüzler kullanmalıyız . Örneğin, istemciler sunucuya bir Kullanıcı verisi gönderirse, sunucunun aynı sınıfta çalışması gerekir. Arayüzler vb. İle aynıdır. Ayrıca, ortak bir arayüzde herhangi bir değişiklik varsa, her iki proje de kodunu yeni duruma ayarlamalıdır.

Şu anda görebildiğim tek çözüm, tüm ortak şeylerin tanımlandığı tek bir ekstra proje yaratmak. Biz ve arkadaşım, bu projeyi ana projeye (istemci veya sunucu) bağımlı olarak eklemeliyiz. Paylaşılan proje bazı sürüm kontrol sistemi tarafından yönetilebilir, bu nedenle her zaman en güncel duruma sahibiz.

Başka hangi çözümü önerirsiniz? Profesyonel uygulamalarda bu tür problemler nasıl çözülür?


1
Bir şeyi paylaşıp paylaşmadığınızı kontrol etmelisiniz. Eğer mı söylüyorsun değil istemci ve sunucu projeleri için sürüm kontrolü kullanarak? Eğer öyleyse, hemen düzeltin.
Sebastian Redl

Yanıtlar:


15

tüm ortak şeylerin tanımlandığı ekstra bir proje yaratın

Bu, yeniden kullanılabilir parçaları paylaşmak için ilk adımdır - ve kolay kısmıdır. Daha zor olan kısım, paylaşılan kütüphaneyi kullanan iki projenin bağımsız yayın döngülerine sahip olup olmayacağına (veya değil) ve "proje A" nın paylaşılan proje programınızın 1.0 sürümünü kullanmasının mümkün olup olmadığına karar vermektir. sürüm 2.0 aynı anda .

İkincisinin mümkün olmasını istiyorsanız, kitaplığınız için sıkı bir sürüm oluşturma şemasına ve sürüm yönetimine (ve @RoryHunter tarafından önerilen gibi kütüphane dosya adının bir parçası olarak sürüm numaralarına) sahip olmanız gerekir. Bu durumda lib'nizde geriye dönük uyumluluğa da dikkat etmelisiniz. Kütüphaneniz, üretimdeki farklı sürümlerin iyi bir fikir olmasını sağlamak için birim testleri ekleyerek ayrı bir ürün olarak yönetilmeli ve Maven gibi bir araç da mantıklı olabilir.

Bununla birlikte, bu durumu önlemek istiyorsanız , "proje A", "proje B" ve lib'inizi ortak bir proje olarak yönetmeli, geliştirme, oluşturma ve bırakma süreciyle yönetmelisiniz. Bu, paylaşılan kitaplığın ortak arabiriminin ilk senaryoda olduğundan çok daha sık değiştirilmesine izin verecektir. Ayrıca kitaplık dosya adında Maven veya sürüm numaraları gibi bir şeye ihtiyacınız olmayacak. Ancak sonuç şu ki, A ve B artık bağımsız olarak geliştirilemez.


13

Çözümünüz doğru. Paylaşılan kodu kendi JAR dosyasını oluşturan başka bir projeye yerleştirin ve her iki projede de kullanın. JAR dosyasını oluştururken, adı ada, örneğin Debian stiline dahil etmek isteyebilirsiniz;

libmyproject-shared-1.0.jar

Sürüm oluşturma sorununu engellemez, ancak yardımcı olacaktır. Maven'i hiç kullanmadım, ama bu durumda yardımcı olabileceğini anlıyorum.


2

tüm ortak şeylerin tanımlandığı ekstra bir proje yaratın

.Net tam olarak bunu yapmayı beklemektedir.

Bu nesneleri üçüncü bir Meclise soyutlayın ve her iki projeden de referans alın. Daha temiz olan Arayüzler olarak yapmanızı öneririm, ama ...

Serileştirmeye dikkat edin:

  • Ben doğrudan tefrika / deserialise kuşkusuz iki program arasında (nesneleri tek yolu bu idi süre kaldırmanın Framework 2.0 kullanarak önceydi) hem paylaşılan hem de sunucu makinelerinde Global Assembly Cache'e "paylaşılan" montajı kurmaktı. Eğer derleme her bir proje için "yerel" ise, Çerçeve bunları farklı Türler olarak gördü ve birini diğerine serileştirmeyi reddetti.
  • Ve Arabirim Olarak Yazılan nesneleri serileştirmek biraz "meydan okuma" dır. Orijinal, Arabirimsiz Tip, Serileştirme "borusu" aracılığıyla "bunu" yapmıyor gibi göründü, böylece alıcı gelen akıştan ne tür bir "inşa edeceğini" bilmiyordu.

1

Diğerlerinin önerdiği gibi, düşünce süreciniz doğrudur. Profesyonel olarak, çoğu bu bağımlılıkları verimli bir şekilde yönetmek için Maven veya Gradle gibi bir şey kullanırdı .

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.