Crear una biblioteca compartida que pueda usarse con aplicaciones de escritorio y proyectos web

7

He estado involucrado en una serie de proyectos de escritorio MVC.NET y c # en nuestra empresa durante el último año más o menos, al mismo tiempo que me las arreglé para mantener mi nariz metida en otros proyectos (en una capacidad de aprendizaje de solo lectura, por supuesto).

De esto he notado que en los diversos proyectos y equipos hay una gran cantidad de funcionalidades que han sido bien diseñadas contra buenas interfaces y abstracciones. Debido a que a veces nos gusta nuestro propio trabajo, noté que un par de proyectos tenían exactamente la misma clase, método copiado en él, ya que obviamente había funcionado en uno y, por lo tanto, fue fácilmente trasladado a un nuevo proyecto (probablemente por el mismo desarrollador que originalmente lo escribió)

Mencioné este hecho en una de nuestras reuniones de programadores que tuvimos ocasionalmente y sugerí que incorporemos parte de esta funcionalidad en una biblioteca central de la compañía que podamos construir con el tiempo y usar en múltiples proyectos. Todos estuvieron de acuerdo y comencé a investigar esta posibilidad.

Sin embargo, me encontré con un obstáculo bastante temprano. Nuestro equipo se centra principalmente en MVC en este momento y tenemos proyectos principalmente en 2.0 pero estamos comenzando a ramificarnos a 3.0. También tenemos una serie de aplicaciones de escritorio que podrían beneficiarse de algunas clases compartidas y métodos auxiliares básicos.

Inicialmente, al crear esta DLL, incluí algunas clases compartidas que podrían usarse en cualquier tipo de proyecto (Web, Cliente, etc.) pero luego comencé a buscar agregar algunos módulos compartidos que serían útiles solo en nuestras aplicaciones MVC. Sin embargo, esto significaba que tenía que incluir una referencia a algunas DLL web de Microsoft para aprovechar algunas de las clases que estaba creando (en esta etapa MVC 2.0).

Ahora mi problema es que tenemos una DLL compartida que tiene referencias a bibliotecas web específicas que también podrían usarse en una aplicación cliente. No solo eso, nuestra DLL hizo referencia inicialmente a MVC 2.0 y eventualmente pasaremos a MVC 3.0 para todos los proyectos. Pero muchas de las clases en esta biblioteca espero que sigan siendo relevantes para MVC 3, etc.

Nuestro código dentro de esta DLL está separado en sus propios espacios de nombres, tales como:

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

Entonces, mis preguntas son:

  1. ¿Está bien hacer una biblioteca compartida como esta, o si tenemos características específicas de la web, deberíamos crear una DLL web separada solo dirigida a un marco específico o una versión MVC?
  2. Si está bien, qué tipo de problemas podríamos enfrentar al usar la biblioteca que hace referencia a MVC 2 en un proyecto MVC 3, por ejemplo. Pensaría que podríamos encontrar algún tipo de problema de compatibilidad, o incluso problemas en los que los desarrolladores que usan la biblioteca no se dan cuenta de que necesitan bibliotecas MVC 2.0. Es posible que solo quieran usar algunas de las clases genéricas, etc.

El concepto parecía una buena idea en ese momento, pero estoy empezando a pensar que tal vez no sea realmente una solución práctica. ¡Pero la cantidad de veces que he visto clases y métodos copiados en todos los proyectos porque son códigos probados probados es un poco desconcertante para ser completamente honesto!

ACTUALIZADO : Además de la respuesta de Bernards, que he tomado en cuenta y parece un buen consejo. Sin embargo, quiero crear algunas clases compartidas que probablemente sean útiles tanto en proyectos MVC 2 como MVC 3. Sin embargo, mi ensamblado compartido tendrá que hacer referencia a uno de los marcos MVC para poder crear mis clases compartidas en primer lugar.

Así que para ampliar mi Q2 anterior.

  1. Si quisiera una solución web MVC 3, ¿tendría que tener un proyecto compartido CompanyDLL.Web.Mvc3 que entonces estaría específicamente haciendo referencia a MVC 3? ¿Eso significaría copiar todo el código de mi solución CompanyDLL.Web.Mvc2 a este nuevo proyecto compartido Mvc3?

Parece que me faltan algunas habilidades fundamentales de diseño en la creación de ensambles compartidos y en la construcción y referencia de diferentes versiones de framework. O podría ser tan simple como absorberlo y crear una biblioteca CompanyDLL.Web.Mvc2 , CompanyDLL.Web.Mvc3 , CompanyDLL.Web.Mvc4 , etc., etc.

dreza
fuente

Respuestas:

5

Cree bibliotecas compartidas separadas para sus diferentes plataformas (escritorio y web). Lo que necesiten ambas bibliotecas debe ir en una biblioteca compartida separada. Por lo tanto, puede dividir estas bibliotecas de la siguiente manera:

  • Company.Core: Utilizado por todas las bibliotecas. Contiene código genérico, clases auxiliares, etc. que no son específicas de ninguna plataforma. No hace referencia a otras bibliotecas compartidas.
  • Company.Core.Desktop: Utilizado por aplicaciones de escritorio. Company.CoreBiblioteca de referencias .
  • Company.Core.Web: Utilizado por aplicaciones web. Company.CoreBiblioteca de referencias .

Esto le permite cambiar la tecnología web que se está utilizando sin afectar la tecnología de escritorio que se está utilizando. Esto también le permite agregar más plataformas en el futuro (por ejemplo Company.Core.Mobile).

Asegúrese de que estas bibliotecas se prueben por unidad y nunca vuelva a copiar código entre proyectos.

Bernardo
fuente
Gracias Bernard por el consejo. ¿Qué pasa con los problemas con la referencia a diferentes versiones de las bibliotecas de Microsoft en las DLL compartidas?
dreza
¿Te refieres a diferentes versiones de las mismas bibliotecas? MVC 2 vs MVC 3?
Bernard
Sí, esto es exactamente lo que hicimos en la misma circunstancia. Perfecto.
gahooa
@Bernardo. Si. Esperaría que nuestra biblioteca compartida haga referencia a MVC 2. Pero, ¿y si un nuevo proyecto que usa esta biblioteca quiere usar MVC 3. Ni siquiera estoy seguro de si eso es un problema, pero es algo que no conozco los efectos de
dreza
2
+1; Estoy bastante seguro de que, a menos que esté utilizando características MUY específicas de las versiones de MVC, están diseñadas para ser compatibles con la mayoría de las versiones.
RichardW1001