Condivisione di classi o interfacce tra diversi progetti

16

Stavo cercando alcune risposte in SO o qui, ma senza risultati, è per questo che ti chiederei.

Supponiamo di avere due progetti diversi, ad esempio parte server e parte client di un'app. Sto sviluppando la mia parte, mentre il mio amico sta facendo il secondo. Ma entrambi dovremmo usare alcune interfacce comuni come User o AccountInfo o ChangableAccount ... qualsiasi cosa al fine di garantire una compatibilità. Ad esempio, se un client invia un dato utente al server, il server dovrebbe operare sulla stessa classe. Lo stesso con le interfacce, ecc. Inoltre, se ci sono cambiamenti in un'interfaccia comune, entrambi i progetti dovrebbero adattare il proprio codice alla nuova situazione.

L'unica soluzione che riesco a vedere ora è creare un progetto in più in cui siano definite tutte le cose comuni. Noi, io e il mio amico, dovremmo aggiungere questo progetto come dipendenza da un progetto principale (client o server). Il progetto condiviso può essere gestito da qualche sistema di controllo della versione, quindi abbiamo sempre lo stato più aggiornato.

Quale altra soluzione suggeriresti? In che modo tali problemi vengono risolti nelle app professionali?

    
posta guitar_freak 04.03.2014 - 13:19
fonte

4 risposte

15

create a one extra project in which all common things are defined

Questo è esattamente il primo passo per condividere parti riutilizzabili - ed è la parte facile. La parte più difficile è decidere se i due progetti che utilizzano la libreria condivisa devono avere cicli di rilascio indipendenti (o meno), e se dovrebbe essere possibile che "progetto A" utilizzi la versione 1.0 della tua lib condivisa, mentre il progetto B usa versione 2.0 allo stesso tempo .

Se si desidera che quest'ultimo sia possibile, è necessario disporre di uno schema di controllo delle versioni rigoroso e di una gestione del rilascio per la libreria (e numeri di versione come parte del nome del file della libreria, come suggerito da @RoryHunter). In questa situazione dovresti anche preoccuparti della retrocompatibilità della tua lib. La tua biblioteca dovrebbe essere gestita come prodotto separato, aggiungendo test unitari per assicurarti che le diverse versioni in produzione siano una buona idea, e anche uno strumento come Maven può avere senso.

Se, tuttavia, vuoi prevenire quella situazione, dovresti gestire "progetto A", "progetto B" e la tua lib come un progetto comune, con un processo combinato di sviluppo, costruzione e rilascio. Ciò consentirà di modificare l'interfaccia comune della libreria condivisa molto più spesso rispetto al primo scenario. E non avrai bisogno di qualcosa come Maven o numeri di versione nel nome del file della libreria. Ma il compromesso è che A e B non possono più essere sviluppati indipendentemente.

    
risposta data 04.03.2014 - 17:08
fonte
12

La tua soluzione è quella giusta. Inserisci il codice condiviso in un altro progetto che crea il proprio file JAR e utilizzalo in entrambi i progetti. Quando si crea il file JAR, è possibile includere la versione nel nome, ad es. in stile Debian;

libmyproject-shared-1.0.jar

Non impedisce problemi di versionamento, ma dovrebbe aiutare. Non ho mai usato Maven, ma capisco che può aiutare in questa situazione.

    
risposta data 04.03.2014 - 13:32
fonte
2

create a one extra project in which all common things are defined

Questo è esattamente il modo in cui .Net si aspetta che tu lo faccia.

Estrarre questi oggetti in una terza Assemblea e fare riferimento a entrambi i progetti. Suggerirei di farlo come interfacce, che è più pulito, ma ...

Attenzione per la serializzazione:

  • L'unico modo per serializzare / deserializzare direttamente gli oggetti tra i due programmi (ammettiamolo era mentre fa usando Framework 2.0) era installare l'assembly "condiviso" nella Global Assembly Cache su entrambi macchine client e server. Se l'assembly era "locale" per ciascun progetto, il Framework li vedeva come tipi discreti e si rifiutava di [serializzare] l'una nell'altra.
  • E la [de] serializzazione di oggetti digitati come interfacce è un po 'una "sfida". Il tipo non-Interface originale non sembrava "renderlo" attraverso la "pipa" di serializzazione, quindi il ricevitore non sapeva quale tipo concreto "costruire" dal flusso in arrivo.
risposta data 04.03.2014 - 13:39
fonte
1

Come altri hanno suggerito, il tuo processo di pensiero è accurato. Professionalmente, la maggior parte userebbe qualcosa come Maven o Gradle per gestire queste dipendenze in modo efficiente.

    
risposta data 04.03.2014 - 16:14
fonte

Leggi altre domande sui tag