En mi humilde opinión, debe intentar usar interfaces mucho. Es más fácil equivocarse al no usar una interfaz que usarla.
Mi principal argumento al respecto es porque las interfaces lo ayudan a crear un código más comprobable. Si un constructor de clase o un método tiene una clase concreta como parámetro, es más difícil (especialmente en C#, donde ningún framework de burlas gratuito permite burlar métodos no virtuales de clases concretas) para realizar pruebas que son pruebas de unidad REAL .
Creo que si tiene un objeto tipo DTO, que usar una interfaz es excesivo, una vez que se burla puede ser incluso más difícil que crear una.
Si no está realizando pruebas, use inyección de dependencia, inversión de control; y espere nunca hacer nada de esto (por favor, evite estar allí, jeje), entonces sugeriría que se usen interfaces cada vez que realmente necesite tener diferentes implementaciones, o si desea limitar la visibilidad que una clase tiene sobre la otra.
+1, es muy fácil extraer una interfaz de la clase utilizando las herramientas de refactorización, por lo que no hay ninguna razón para hacerlo de antemano a menos que sepa con certeza que necesita una interfaz. –