Existem diretrizes para decidir quando uma classe deve estar em seu próprio assembly / DLL? Muitas vezes vejo duas escolas de pensamento:
1) Todo "agrupamento" de classes pertence à sua própria DLL, por exemplo, Repositórios, Serviços, DTOs, Infraestrutura, etc.
2) Tudo deve estar em uma única DLL, mas separado por namespaces / pastas, por exemplo, ter uma DLL "Core" com namespaces adicionais, como Core.Repositories, Core.Services, Core.DTO, etc.
No trabalho, apenas agrupamos tudo em uma única assembléia chamada "Negócios". Existem algumas pastas, mas não há uma separação real - os objetos de negócios (com lógica, alguns dos quais nem deveriam ser classes) são agrupados em uma pasta "BusinessObjects" sem cuidado. Os itens usados em mais de uma classe estão em uma pasta "Principal". Os utilitários estão em uma pasta "Utilitários", a infraestrutura de acesso a dados é uma pasta "Dados" - você entendeu.
Para um novo módulo em que estou trabalhando, quero / preciso ter uma camada de acesso a dados separada (pense em uma implementação rudimentar do Repositório), mas não quero jogá-la na pasta "BusinessObjects" com as outras 160 (!) aulas lá. Ao mesmo tempo, estou preocupado em criar uma nova biblioteca de classes, pois todo mundo está acostumado a encher uma classe na única biblioteca; uma pasta / espaço para nome pode funcionar no entanto.
fonte
"Tio Bob" Martin, do Clean Code, a fama dos Princípios do SOLID destacou três princípios aqui :
A regra geral é que você deve manter o número de projetos em sua solução o mais baixo possível. Divida-os apenas se for necessário fazê-lo para implementar uma ou mais histórias de usuário específicas ou se um único assembly estiver causando problemas de desempenho mensuráveis (normalmente quando eles atingem vários megabytes de tamanho).
fonte
Outros princípios orientadores com os quais trabalho:
Você acha que reutilizará esse código em outros projetos? Para um grupo de aplicativos Web relacionados, tínhamos um módulo relacionado à conta do usuário que todos os aplicativos utilizavam, pois todos usavam o mesmo modelo para contas e logins do usuário. Fiz coisas semelhantes com bibliotecas de geometria e matemática e as reutilizei em vários aplicativos, incluindo a DLL.
Deseja modificar / implantar esse código sem reimplementar / recompilar todo o projeto? Às vezes, é útil apenas reconstruir o módulo, implantar e reiniciar o aplicativo Web.
Parece que, no seu caso, um Repositório básico e genérico pode ser útil novamente no futuro; pode valer a pena separá-lo em uma nova DLL, se você puder.
fonte