Creazione di una libreria condivisa che potrebbe essere utilizzata con applicazioni desktop e progetti web

8

Sono stato coinvolto in un certo numero di progetti desktop MVC.NET e c # nella nostra azienda nell'ultimo anno o giù di lì mentre riuscivo anche a mantenere il mio naso inserito in altri progetti (in una capacità di apprendimento di sola lettura, ovviamente).

Da questo ho notato che attraverso i vari progetti e team c'è un sacco di funzionalità che è stata ben progettata contro buone interfacce e astrazioni. Dato che a volte tendiamo ad apprezzare il nostro lavoro, ho notato che un paio di progetti avevano esattamente la stessa classe, il metodo copiato in esso, come ovviamente aveva funzionato su uno, e quindi è stato facilmente spostato in un nuovo progetto (probabilmente dallo stesso sviluppatore che lo scrisse originariamente)

Ho menzionato questo fatto in uno dei nostri incontri programmatori che abbiamo occasionalmente suggerito di utilizzare alcune di queste funzionalità in una libreria aziendale principale che possiamo creare nel tempo e utilizzare in più progetti. Tutti sono d'accordo e ho iniziato a valutare questa possibilità.

Tuttavia, mi sono imbattuto in una pietra d'inciampo abbastanza presto. Il nostro team si concentra principalmente su MVC al momento e abbiamo progetti principalmente in 2.0 ma stanno iniziando a diramarsi a 3.0. Abbiamo anche un numero di applicazioni desktop che potrebbero beneficiare di alcune classi condivise e metodi di supporto di base.

Inizialmente durante la creazione di questa DLL ho incluso alcune classi condivise che potevano essere utilizzate in qualsiasi tipo di progetto (Web, Client, ecc.) ma poi ho iniziato a considerare l'aggiunta di alcuni moduli condivisi che sarebbero utili solo nelle nostre applicazioni MVC. Tuttavia, ciò significava che dovevo includere un riferimento ad alcune DLL Web di Microsoft al fine di sfruttare alcune delle classi che stavo creando (in questa fase MVC 2.0).

Ora il mio problema è che abbiamo una DLL condivisa che ha riferimenti a librerie web specifiche che potrebbero anche essere usate in un'applicazione client. Non solo, la nostra DLL fa riferimento inizialmente a MVC 2.0 e alla fine passeremo a MVC 3.0 per tutti i progetti. Ma molte delle classi in questa libreria mi aspettano di essere ancora rilevanti per MVC 3 ecc.

Il nostro codice all'interno di questa DLL è separato in spazi dei nomi come:

  • CompanyDLL.Primitives
  • CompanyDLL.Web.Mvc
  • CompanyDLL.Helpers etc etc

Quindi, le mie domande sono:

  1. È OK fare una libreria condivisa come questa, o se abbiamo delle funzionalità web specifiche in essa dovremmo creare una web DLL separata indirizzata solo a un framework specifico o alla versione MVC?
  2. Se è OK, quale tipo di problemi dovremmo affrontare quando utilizziamo la libreria che fa riferimento a MVC 2 in un progetto MVC 3, ad esempio. Penserei che potremmo incorrere in qualche tipo di problema di compatibilità, o anche problemi in cui gli sviluppatori che utilizzano la libreria non si rendono conto che hanno bisogno di librerie MVC 2.0. Potrebbero voler solo utilizzare alcune classi generiche ecc.

All'epoca il concetto sembrava una buona idea, ma sto iniziando a pensare che forse non è davvero una soluzione pratica. Ma il numero di volte in cui ho visto le classi e i metodi copiati in tutti i progetti perché sono testati testati è un po 'snervante per essere perfettamente onesto!

AGGIORNAMENTO : Oltre a Bernards rispondo che ho preso a bordo e sembra un buon consiglio. Tuttavia, voglio creare alcune classi condivise che saranno probabilmente utili in entrambi i progetti MVC 2 e MVC 3. Tuttavia il mio assembly condiviso dovrà fare riferimento a uno dei framework MVC per poter creare le mie classi condivise in primo luogo.

Quindi espandimi ulteriormente sulla mia Q2.

  1. Se volessi una soluzione web MVC 3 dovrei avere un progetto CompanyDLL.Web.Mvc3 condiviso che farebbe quindi riferimento specifico a MVC 3? Significherebbe copiare su tutto il codice dalla mia soluzione CompanyDLL.Web.Mvc2 a questo nuovo progetto condiviso Mvc3?

Sembra che manchi alcune fondamentali capacità di progettazione nella creazione di assembly condivisi e la creazione e il riferimento a versioni di framework diverse. Oppure potrebbe essere semplice come lo succhiamo e creiamo un CompanyDLL.Web.Mvc2 , CompanyDLL.Web.Mvc3 , CompanyDLL.Web.Mvc4 etc etc librerie ...

    
posta dreza 25.03.2012 - 03:21
fonte

1 risposta

5

Crea librerie condivise separate per le diverse piattaforme (desktop e web). Qualunque cosa entrambe queste librerie avranno bisogno dovrebbero andare in una libreria condivisa separata. Pertanto, puoi dividere queste librerie come segue:

  • Company.Core : utilizzato da tutte le librerie. Contiene codice generico, classi helper, ecc. Che non sono specifici per alcuna piattaforma. Non fa riferimento a nessun'altra libreria condivisa.
  • Company.Core.Desktop : utilizzato dalle applicazioni desktop. Bibliografia Company.Core riferimenti.
  • Company.Core.Web : utilizzato dalle applicazioni Web. Bibliografia Company.Core riferimenti.

Ciò consente di modificare la tecnologia Web utilizzata senza influire sulla tecnologia desktop utilizzata. Ciò ti consente anche di aggiungere più piattaforme in futuro (ad esempio Company.Core.Mobile ).

Assicurati che queste librerie siano testate dall'unità e non copino più codice tra i progetti.

    
risposta data 26.03.2012 - 04:51
fonte

Leggi altre domande sui tag