Estoy buscando algunos consejos sobre cómo permitir una fácil personalización y extensión de un producto central por cliente. Sé que es probablemente una gran pregunta. Sin embargo, realmente necesitamos obtener algunas ideas, como si obtuviéramos la configuración de este error, nos podría causar problemas durante años. No tengo mucha experiencia en personalizar y extender productos existentes.¿Cuál es una buena estructura de solución para permitir una fácil personalización de un producto por cliente?
Tenemos un producto principal que generalmente especificamos por cliente. Recientemente hemos reescrito el producto en C# 4 con un frontend MVC3. Hemos rediseñado y ahora tienen 3 proyectos que componen la solución: (. Espacio de nombres - projectname.domain *) -
- proyecto básico de dominio que consiste en modelos de dominio (para su uso por EF), interfaces de servicio de dominio, etc (interfaces de repositorio) proyecto de infraestructura
- de dominio (-projectname.infrastructure espacio de nombres *) -. que implementa el contexto de dominio de servicio-EF, la implementación del repositorio, carga/descarga de interfaz implementaciones etc.
- MVC3 (espacio de nombres -. projectname.web *) -proyecto que consiste en controladores, viewmodels, CSS, contenido, scripts, etc. También tiene IOC (Ninject) manejando DI para el proyecto.
Esta solución funciona bien como un producto independiente. Nuestro problema es ampliar y personalizar el producto por cliente. Por lo general, nuestros clientes desean que les enviemos la versión del producto principal de manera muy rápida (por lo general, dentro de los dos días posteriores a la firma de un contrato) con CSS y estilo de marca. Sin embargo, el 70% de los clientes quiere que las personalizaciones cambien su funcionamiento. Algunas personalizaciones son pequeñas, como propiedades adicionales en el modelo de dominio, modelo de vista y vista, etc. Otras son más significativas y requieren controladores y modelos de dominio completamente nuevos.
Algunas personalizaciones parecen ser útiles para todos los clientes, por lo que periódicamente nos gustaría para cambiarlos de ser personalizaciones y agregarlos al núcleo.
Actualmente estamos almacenando el código fuente en TFS. Para comenzar un proyecto, normalmente copiamos manualmente la fuente en un nuevo proyecto de equipo. Cambie el espacio de nombre para reflejar el nombre del cliente y comience a personalizar las partes básicas y luego impleméntelo en Azure. Obviamente, esto resulta en una base de código completamente duplicada y estoy seguro de que no es la forma correcta de hacerlo. Creo que probablemente deberíamos tener algo que proporcione las características principales y amplíe/sustituya cuando sea necesario. Sin embargo, no estoy seguro de cómo hacerlo.
por lo que estoy buscando algún consejo sobre la mejor configuración del proyecto que permitiría:
- Rápida implementación del código - tan fácil para empezar un nuevo cliente para permitir marca/cambios menores
- evitar la necesidad de copiar y pegar el código de
- el uso de DI tanto como sea posible para mantenerlo imprecisa
- permitir la bespoking del código en una base por cliente
- La capacidad de extender el producto principal en un solo lugar y tienen todos los clientes a obtener esa funcionalidad si tenemos la última versión del núcleo y volver a desplegar
Cualquier ayuda/consejo es muy apreciada. Feliz de agregar más información que cualquiera piense que ayudará.
Después de intentar la bifurcación por cliente para 5 proyectos, nos damos por vencidos. Ahora lo hemos escrito como un producto único que utiliza MEF y DI para unirlo según la configuración del cliente. También significa que podemos implementarlo en un único servidor web y escalar mejor. – GraemeMiller
Vea esto en multi-tenancy que cubre la situación http://codeofrob.com/entries/multi-tenancy-in-asp.net-mvc---ddd8-video.html – GraemeMiller