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.