Ho una libreria in cui voglio usare un logger ma non ho (e non posso) creare alcuna interfaccia per questo perché la userò su sistemi diversi che non hanno nulla in comune (e non avranno ). Quindi questo non funzionerà:
public void Foo(ILogger logger, ... other params)
{
logger.Info(...):
}
Per superare questo problema e per rendere possibile l'utilizzo di qualsiasi framework di registrazione che utilizza un particolare sistema, ho trovato questa soluzione:
Ho creato una classe che forniva delegati per i metodi di registrazione:
public class LoggerProxy
{
private Action<string> _info;
public LoggerProxy(Action<string> info)
{
_info = info;
}
public void Info(string message)
{
if (_info != null) _info(message);
}
}
E lo userei in questo modo:
static void Main()
{
var logger = new LoggerProxy(SomeLoggingSystem.Info);
Foo(logger, ...);
}
public void Foo(LoggerProxy logger, ... other params)
{
logger.Info(...):
}
Lo chiamo proxy ma sono curioso di sapere se è davvero un proxy o forse un adattatore o ancora qualcos'altro. Ho letto le risposte a come fanno le Proxy, Decorator, Adapter e Bridge Patterns differiscono? ma non posso dire di poter dire con certezza che nessuno di questi nomi va bene qui.