m3th0dman ha mostrato il principio generale, ma la sua soluzione non si adatta al problema come ho capito, dal momento che i nomi dei metodi mi fanno pensare che CallMeDuringAPplicationLifecycle possa essere chiamato più volte.
In C #, una risorsa che ha bisogno di pulizia (come il lavaggio dei buffer o la chiusura delle connessioni) dovrebbe usare l'implementazione IDisposable .
interface IConnectionFactory
{
IConnection connect(); // This is CallMeFirst
}
interface IConnection : IDisposable
{
void send(); // This is CallMeDuringApplicationLifecycle
}
// And the Dispose() method of IDisposable is CallMeOnApplicationExit.
In questo modo, imponi che CallMeFirst venga chiamato per primo, perché non c'è altro modo per ottenere un IConnection . E poiché i programmatori C # riconoscono IDisposable , sanno che devono chiamare Dispose quando hanno terminato la connessione. In realtà non è possibile applicarlo in C #, quindi è il più vicino possibile. (Puoi anche scrivere un finalizzatore che controlli che sia stato chiamato Dispose , ma non puoi fare altro che registrare l'errore lì, e non c'è alcuna garanzia che i finalizzatori saranno chiamati.)