¿Cómo encaja el principio SOLID abierto / cerrado con la inyección de dependencia y la inversión de dependencia?

Estoy empezando a aplicar los principios SÓLIDOS, y los encuentro un poco contradictorios. Mi problema es el siguiente:

Mi comprensión del principio de inversión de dependencia es que las clases deberían depender de abstracciones. En la práctica, esto significa que las clases deben derivarse de las interfaces. Todo bien hasta ahora.

A continuación, entiendo el principio abierto / cerrado es que después de un cierto punto de corte, no debe alterar el contenido de una clase, sino que debe extender y anular. Esto tiene sentido hasta ahora para mí.

Entonces, dado lo anterior, terminaría con algo como esto:

public interface IAbstraction
{
    string method1(int example);
}

public Class Abstraction : IAbstraction
{
   public virtual string method1(int example)
   {
       return example.toString();
   }
}

y luego, en el momento T, el método1 ahora necesita agregar "ExtraInfo" en su valor devuelto. En lugar de alterar la implementación actual, crearía una nueva clase que se extiendaAbstraction y hacer que haga lo que necesitaba, de la siguiente manera.

public Class AbstractionV2 : Abstraction 
{
   public override string method1(int example)
   {
       return example.toString() + " ExtraInfo";
   }
}

Y puedo ver que la razón para hacer esto es que solo el código que quiero llamar a este método actualizado lo llamará, y el resto del código llamará al método anterior.

Todo tiene sentido para mí, y supongo que mi comprensión es correcta.

Sin embargo, también estoy usando la inyección de dependencia (inyector simple), por lo que mis implementaciones nunca son a través de una clase concreta, sino a través de mi configuración DI, como sigue:

container.Register<IAbstraction, Abstraction>();

El problema aquí es que, bajo esta configuración, puedo actualizar mi configuración DI para que sea:

container.Regis,ter<IAbstraction, AbstractionV2>();

En cuyo caso, todas las instancias ahora llamarán al nuevo método, lo que significa que no he logrado no cambiar el método original.

O

Creo una nueva interfazIAbstractionV2 e implementar la funcionalidad actualizada allí, lo que significa duplicación de la declaración de la interfaz.

No puedo ver ninguna forma de evitar esto, lo que me lleva a preguntarme si la inyección de dependencia y SOLID son compatibles. ¿O me estoy perdiendo algo aquí?

Respuestas a la pregunta(3)

Su respuesta a la pregunta