O que é uma boa estrutura de solução para permitir a fácil personalização de um produto por cliente?

Estou procurando alguns conselhos sobre como permitir a fácil personalização e extensão de um produto principal por cliente. Eu sei que é provavelmente uma questão muito grande. No entanto, precisamos mesmo de ter algumas ideias, como se tivéssemos uma configuração errada, isso poderia causar-nos problemas durante anos. Não tenho muita experiência em personalizar e ampliar produtos existentes.

Temos um produto principal que geralmente é personalizado por cliente. Nós reescrevemos recentemente o produto em C # 4 com um frontend MVC3. Já refatoramos e agora temos 3 projetos que compõem a solução:

Projeto de domínio principal (namespace - projectname.domain. *) - consistindo em modelos de domínio (para uso pelo EF), interfaces de serviço de domínio, etc (interfaces de repositório)Projeto de infraestrutura de domínio (namespace -projectname.infrastructure. *) - que implementa o serviço de domínio-EF Contexto, implementação de repositório, implementações de interface de upload / download de arquivos etc.MVC3 (namespace - projectname.web. *) - projeto que consiste em controllers, viewmodels, CSS, conteúdo, scripts, etc. Também possui IOC (Ninject) manipulando DI para o projeto.

Esta solução funciona bem como um produto independente. Nosso problema é estender e personalizar o produto por cliente. Nossos clientes geralmente querem que a versão principal do produto seja fornecida a eles rapidamente (geralmente em alguns dias após a assinatura de um contrato) com CSS e estilo de marca. No entanto, 70% dos clientes querem que as personalizações alterem a maneira como elas funcionam. Algumas personalizações são pequenas, como propriedades adicionais no modelo de domínio, no modelo de visualização e na visualização, etc. Outras são mais significativas e exigem modelos e controladores de domínio totalmente novos, etc.

Algumas personalizações parecem ser úteis para todos os clientes, então, periodicamente, gostaríamos de alterá-las de serem customizações e adicioná-las ao núcleo.

Atualmente, estamos armazenando o código-fonte no TFS. Para iniciar um projeto, normalmente copiamos manualmente a fonte para um novo projeto de equipe. Altere o namespace para refletir o nome do cliente e comece a personalizar as partes básicas e, em seguida, implante no Azure. Isso obviamente resulta em uma base de código totalmente duplicada e tenho certeza de que não é o caminho certo para fazer isso. Acho que provavelmente devemos ter algo que forneça os recursos principais e estenda / substitua onde necessário. No entanto, eu realmente não sei como fazer isso.

Então, estou procurando algum conselho sobre a melhor configuração de projeto que permita:

Implantação rápida do código - é tão fácil iniciar um novo cliente para permitir marcas / pequenas alteraçõesEvitar a necessidade de copiar e colar códigoUse o máximo de DI possível para mantê-lo fracamente acopladoPermitir a indicação do código por clienteA capacidade de estender o produto principal em um único lugar e fazer com que todos os clientes obtenham essa funcionalidade se obtivermos a versão mais recente do núcleo e reimplementar

Qualquer ajuda / conselho é muito apreciada. Feliz em adicionar mais informações que alguém acha que vai ajudar.

questionAnswers(2)

yourAnswerToTheQuestion