De acordo com o SOLID, você não apenas deve criar a interface, mas também em um arquivo diferente, em um assembly diferente.
Por quê? Como qualquer alteração em um arquivo de origem que é compilado em um assembly requer recompilação do assembly, e qualquer alteração em um assembly requer recompilação de qualquer assembly dependente. Portanto, se seu objetivo, com base no SOLID, é poder substituir uma implementação A por uma implementação B, enquanto a classe C dependente da interface I não precisa saber a diferença, é necessário garantir que a montagem com I nele não muda, protegendo assim os usos.
"Mas é apenas uma recompilação" eu ouço você protestar. Bem, pode ser, mas no aplicativo para smartphone, que é mais fácil com a largura de banda de dados dos usuários; baixar um binário que mudou ou fazer o download desse binário e cinco outros com código que depende dele? Nem todo programa é escrito para ser consumido por computadores de mesa em uma LAN. Mesmo nesse caso, onde a largura de banda e a memória são baratas, os lançamentos menores de patches podem ter valor porque são triviais para serem enviados a toda a LAN através do Active Directory ou de camadas de gerenciamento de domínio semelhantes; seus usuários aguardarão apenas alguns segundos para que sejam aplicados na próxima vez que fizerem login, em vez de alguns minutos para que tudo seja reinstalado. Sem mencionar que, quanto menos montagens precisarem ser recompiladas ao criar um projeto, mais rápido ele será construído,
Agora, o aviso: nem sempre é possível ou possível fazer isso. A maneira mais fácil de fazer isso é criar um projeto "interfaces" centralizado. Isso tem suas próprias desvantagens; o código se torna menos reutilizável porque o projeto de interface E o projeto de implementação precisam ser referenciados em outros aplicativos que reutilizam a camada de persistência ou outros componentes principais do seu aplicativo. Você pode superar esse problema dividindo as interfaces em montagens mais firmemente acopladas, mas você tem mais projetos em seu aplicativo, o que torna muito difícil uma compilação completa. A chave é o equilíbrio e a manutenção do design fracamente acoplado; geralmente você pode mover os arquivos conforme necessário, portanto, quando perceber que uma classe precisará de muitas alterações ou que novas implementações de uma interface serão necessárias regularmente (talvez para fazer a interface com versões de outro software com suporte recente,