Quello che stai cercando è il modello dell'adattatore: link
Usando questo modello puoi creare un wrapper attorno alla classe esterna.
Consente di prendere la seguente classe esterna:
public sealed class SomeExternalClassWithoutInterface
{
private readonly string _someValue;
public SomeExternalClassWithoutInterface(string someConstructorValue)
{
_someValue = someConstructorValue;
}
public string Method1()
{
return _someValue;
}
public int Method2()
{
return _someValue.Length;
}
}
Ora possiamo facilmente creare la nostra classe come wrapper attorno a questa classe esterna e Implementare un'interfaccia:
public class ExternalClassAdapter : IExternalClassAdapter
{
private readonly SomeExternalClassWithoutInterface _someExternalClassWithoutInterface;
// DI implementation, this is not neccesary
public ExternalClassAdapter(SomeExternalClassWithoutInterface someExternalClassWithoutInterface)
{
_someExternalClassWithoutInterface = someExternalClassWithoutInterface;
}
// Constructor Without Depedency Injection, this is not preferable.
public ExternalClassAdapter(string someValue)
{
_someExternalClassWithoutInterface = new SomeExternalClassWithoutInterface(someValue);
}
public string Method1()
{
return _someExternalClassWithoutInterface.Method1();
}
public int Method2()
{
return _someExternalClassWithoutInterface.Method2();
}
}
Questa è la nostra interfaccia, che sta implementando tutti i metodi usati nella classe esterna. (Se sono disponibili molti metodi, separare le interfacce in base al principio di Segregazione interfaccia)
public interface IExternalClassAdapter
{
string Method1();
int Method2();
}
Ora, quando questa classe Adapter viene utilizzata nell'applicazione anziché nella classe esterna, dovresti essere in grado di prendere in giro qualsiasi altra implementazione abbastanza facilmente.
Non dovresti mai usare classi esterne non interfacciate nel tuo codice.
Link di Pastebin (poiché la descrizione del codice non funziona bene qui): link
Se, per qualsiasi motivo, hai bisogno anche di un modello di facciata ... Puoi ancora avvolgere questi 2 adattatori in una singola facciata! Ma non creare un'unica facciata su 2 classi esterne!