Como estruturar várias soluções / projetos sobrepostos no .Net?

16

Recentemente, comecei a trabalhar para um novo cliente com uma antiga base de código herdada na qual existem várias soluções .net, cada uma normalmente hospeda alguns projetos exclusivos dessa solução, mas depois "empresta" / "vincula" (adiciona projeto existente) outros projetos que tecnicamente pertence a outras soluções (pelo menos se você seguir a estrutura de pastas no TFS)

Eu nunca vi uma configuração tão entrelaçada, não há uma ordem de compilação clara, às vezes um projeto na solução A apenas dlls de referência diretamente do diretório de saída de um projeto hospedado na solução B, às vezes o projeto foi incluído diretamente, mesmo que resida Muito longe na estrutura da pasta.

Parece que tudo foi otimizado para preguiça do desenvolvedor.

Quando os confrontei por que eles não tinham um servidor de IC, eles responderam que é difícil configurar o código organizado como ele é. (Estou configurando agora e xingando essa organização de código)

As soluções são organizadas em torno de artefatos de implantação (as coisas que precisam ser implantadas juntas estão na mesma solução), o que eu acho que é uma decisão sábia, mas o conteúdo dessas soluções (os projetos) está em todo lugar.

Existe um consenso de uma prática recomendada a ser usada ao reutilizar bibliotecas de classes comuns em várias soluções / artefatos de implantação,

  • Como estruturar o código no VCS
  • Como facilitar o compartilhamento da lógica de negócios entre artefatos de implementação separados
AndreasKnudsen
fonte

Respostas:

9

Nunca fui fã de incluir projetos existentes que pertencem a outras soluções. Existem muitas variáveis ​​nas quais a edição desse projeto para uma solução quebra completamente algo em outra solução. Ao corrigir esse problema, você acaba quebrando a solução original. Espuma, enxágüe, repita.

Quando esse tipo de dependência vaza para várias soluções, eu gosto de separar o código dependente em sua solução OWN e criar uma biblioteca de caixa preta que é incluída como referência. Meu pensamento é que suas soluções foram interligadas para que a depuração pudesse ser feita no projeto compartilhado de todas as soluções. Se a biblioteca for criada e testada corretamente, esse tipo de depuração não será realmente necessário. A biblioteca deve poder se sustentar por seus próprios méritos e deve ser testada minuciosamente para que as expectativas de qualquer projeto de consumidor sejam atendidas de forma consistente.

Joel Etherton
fonte
3
Além disso, a refatoração é tão fácil nos dias de hoje, então se você fazer sentir que alguns spur-of-the-moment mudança é bastante importante para fazer na própria biblioteca, você pode torná-lo seu projeto de aplicativo agora e mesclá-lo para a biblioteca mais tarde , quando você estiver menos distraído com sua tarefa atual e tiver tempo para fazer os testes adequados.
Aaronaught 19/08/11
@Aaronaught: +1 a isso.
Joel Etherton
5

Na verdade, organizei estruturas TFS como a que você mencionou e, apesar de apresentar desafios únicos para a CI, possui vários benefícios diferentes. Uma clara é que ela suporta e incentiva a componenteização adequada em projetos .NET separados e, portanto, oferece suporte a um bom TDD, incentivando 100% da cobertura do teste. Logo de cara, noto alguns problemas que você pode resolver.

às vezes um projeto na solução A apenas dlls de referência diretamente do diretório de saída de um projeto hospedado na solução B, às vezes o projeto acaba de ser incluído diretamente, mesmo que resida FAR na estrutura de pastas.

Referências binárias à saída de outros diretórios não são uma boa abordagem e se tornam ruins quando mescladas com referências de projeto. Tente fazer uma ou outra, alterando preferencialmente suas referências binárias para referências de projeto para obter consistência, no mínimo. Nesse ponto, cada solução pode representar um único aplicativo ou camada de aplicativo montável (por exemplo, SuperApp.sln, OtherAppServices.sln, OtherAppPresentationTier.sln).

Para criar TODOS os projetos, recomendo a criação de uma solução mestre também. A Master Solution terá referências de projeto a tudo e existe essencialmente para o único benefício de ter um único comando de compilação que lida com todos os projetos no conjunto de aplicativos. Os desenvolvedores não devem usar a Solução Mestre para desenvolvimento ativo ou depuração. Isso facilita a montagem dos artefatos de construção.

A implantação pode ser feita com um lote simples, powershell ou script Perl. Essencialmente, isso criará a solução apropriada ou a solução Master e, em seguida, implantará tudo nos ambientes adequados. Isso pode ser facilmente integrado a qualquer servidor de IC, se feito corretamente.

• Como facilitar o compartilhamento da lógica de negócios entre artefatos de implementação separados

Crie um projeto para lógica de negócios comum ou tenha uma separação melhor de preocupações para uma lógica de negócios mais global ou universal. Todas as soluções implementáveis ​​que desejam fazer referência a isso devem fazer isso por uma referência de projeto.

Ao organizar seu código no TFS, fica mais fácil conseguir isso mantendo projetos comuns ou compartilhados em um nível mais alto na árvore de diretórios.

maple_shaft
fonte