¿Cuál es una buena estructura de solución para permitir una fácil personalización de un producto por cliente?

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 pregunta demasiado grande. Sin embargo, realmente necesitamos obtener algunas ideas, ya que si la configuración de este error nos causara problemas durante años. No tengo mucha experiencia en personalizar y ampliar productos existentes.

Tenemos un producto central que generalmente diseñamos a medida por cliente. Recientemente hemos reescrito el producto en C # 4 con una interfaz MVC3. Hemos refaccionado y ahora tenemos 3 proyectos que componen la solución:

Proyecto de dominio central (espacio de nombres - nombre de proyecto .dominio. *) - que consiste en modelos de dominio (para uso de EF), interfaces de servicio de dominio, etc. (interfaces de repositorio)Proyecto de infraestructura de dominio (namespace -projectname.infrastructure. *) - que implementa el servicio de dominio-Contexto EF, implementación en Repository, implementaciones de interfaz de carga / descarga de archivos, etc.MVC3 (namespace - projectname.web. *) - proyecto que consta de controladores, modelos de vista, CSS, contenido, scripts, etc. También tiene IOC (Ninject) que maneja 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 se les entregue la versión principal del producto muy rápidamente (generalmente dentro de un par de días a partir de la firma de un contrato) con CSS y estilo de marca. Sin embargo, el 70% de los clientes quiere que las personalizaciones cambien la forma en que funcionan. Algunas personalizaciones son pequeñas, como propiedades adicionales en el modelo de dominio, el modelo de vista y la vista, etc. Otras son más significativas y requieren modelos de dominio y controladores completamente nuevos, etc.

Algunas personalizaciones parecen ser útiles para todos los clientes, por lo que periódicamente nos gustaría cambiarlas para que sean personalizaciones y agregarlas al núcleo.

Actualmente estamos almacenando el código fuente en TFS. Para iniciar un proyecto, normalmente copiamos manualmente la fuente en un nuevo Proyecto de equipo. Cambie el espacio de nombres para reflejar el nombre de los clientes y comenzar a personalizar las partes básicas y luego implementarlo en Azure. Obviamente, esto da como resultado 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 funciones principales y se amplíe / anule cuando sea necesario. Sin embargo, realmente no estoy seguro de cómo hacerlo.

Así que estoy buscando algún consejo sobre la mejor configuración de proyecto que permita:

Rápida implementación del código: es muy fácil comenzar con un nuevo cliente para permitir cambios de marca / menoresEvitar la necesidad de copiar y pegar el código.Uso de la mayor cantidad de DI posible para mantenerlo acoplado librementePermitir que el código sea hecho a medida por clienteLa capacidad de extender el producto central en un solo lugar y hacer que todos los clientes obtengan esa funcionalidad si obtenemos la última versión del núcleo y re-implementamos

Cualquier ayuda / consejo es muy apreciado. Feliz de agregar más información que cualquiera piense que ayudará.

Respuestas a la pregunta(2)

Su respuesta a la pregunta