Creando una biblioteca compartida que podría usarse con aplicaciones de escritorio y proyectos web

8

He estado involucrado en una serie de proyectos de escritorio MVC.NET y c # en nuestra empresa durante el último año, al mismo tiempo que conseguí mantener mi nariz metida en otros proyectos (en una capacidad de aprendizaje de solo lectura, por supuesto).

A partir 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. Como a veces nos gusta nuestro propio trabajo, noté que un par de proyectos tenían exactamente la misma clase, método copiado en él como obviamente había funcionado en uno y así fue movido fácilmente a un nuevo proyecto (probablemente por el mismo desarrollador que originalmente lo escribí)

Mencioné este hecho en una de nuestras reuniones de programadores que tenemos ocasionalmente y sugerimos que incorporemos parte de esta funcionalidad en una biblioteca central de la empresa que podamos desarrollar con el tiempo y usar en múltiples proyectos. Todos estuvieron de acuerdo y comencé a estudiar esta posibilidad.

Sin embargo, me he encontrado 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 empezando a cambiar a 3.0. También tenemos varias aplicaciones de escritorio que podrían beneficiarse de algunas clases compartidas y métodos de ayuda 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 considerar 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 específicas de la web 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 nos moveremos 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
  • CompanyDLL.Web.Mvc
  • CompanyDLL.Helpers etc. etc.

Por lo tanto, mis preguntas son:

  1. ¿Está bien hacer una biblioteca compartida como esta, o si tenemos características específicas para la web, deberíamos crear una DLL web separada dirigida únicamente 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 de MVC 3, por ejemplo. Pensaría que podríamos encontrarnos con algún tipo de problema de compatibilidad, o incluso con problemas en los que los desarrolladores que usan la biblioteca no se dan cuenta de que necesitan las bibliotecas MVC 2.0. Es posible que solo quieran usar algunas de las clases genéricas, etc.

El concepto me pareció 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 los proyectos porque son un código probado es un poco desconcertante para ser perfectamente 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 en los proyectos MVC 2 y MVC 3. Sin embargo, mi conjunto compartido tendrá que hacer referencia a uno de los marcos MVC para que pueda crear mis clases compartidas en primer lugar.

Así que para ampliar más en mi Q2 anterior.

  1. Si quisiera una solución web de MVC 3, ¿tendría que tener un proyecto CompanyDLL.Web.Mvc3 compartido que se refiera específicamente a MVC 3? ¿Significaría eso copiar todo el código de mi solución CompanyDLL.Web.Mvc2 a este nuevo proyecto compartido de Mvc3?

Parece que me faltan algunas habilidades fundamentales de diseño en la creación de ensamblajes compartidos y la construcción y referencia de diferentes versiones de framework. O podría ser tan simple como lo absorbemos y creamos un CompanyDLL.Web.Mvc2 , CompanyDLL.Web.Mvc3 , CompanyDLL.Web.Mvc4 etc bibliotecas ...

    
pregunta dreza 25.03.2012 - 03:21

1 respuesta

5

Cree bibliotecas compartidas separadas para sus diferentes plataformas (de escritorio y web). Cualquier cosa que necesiten estas dos bibliotecas debe ir en una biblioteca compartida separada. Por lo tanto, podría dividir estas bibliotecas de la siguiente manera:

  • Company.Core : utilizado por todas las bibliotecas. Contiene código genérico, clases de ayuda, etc. que no son específicos de ninguna plataforma. No hace referencia a otras bibliotecas compartidas.
  • Company.Core.Desktop : utilizado por aplicaciones de escritorio. Referencias Company.Core library.
  • Company.Core.Web : utilizado por aplicaciones web. Referencias Company.Core library.

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 estén probadas por unidades y que nunca vuelvan a copiar el código entre proyectos.

    
respondido por el Bernard 26.03.2012 - 04:51

Lea otras preguntas en las etiquetas