Ho una classe che fa alcune operazioni sui dati, e voglio avere diversi schemi di blocco (no-lock, simple-lock e read lock-writer lock) in diverse situazioni.
Pensa a questa classe principale come a una classe di raccolta. In un'istanza questa raccolta viene popolata da dati da un file e su un singolo thread. In questo caso non uso alcun blocco. Dove, come in altri scenari, i dati della raccolta vengono popolati da più Rx-stream (e potenzialmente su più thread) e voglio avere qualche meccanismo di blocco in atto.
Quindi, ho deciso di astrarre il blocco effettivo in una classe di politica diversa e di inserire questa classe di politica di blocco nella classe principale.
Di seguito è riportato il diagramma di classe per le mie interfacce / classi di politiche di blocco:
La classe principale invocerebbe i metodi EnterRead / EnterWrite sulla politica per acquisire il blocco, prima di eseguire operazioni di lettura / scrittura sui dati. Al termine dell'operazione, la classe rilascia il blocco disponendo il token di blocco restituito dai metodi EnterRead / EnterWrite.
La mia domanda è, ho ragione nel pensare che potrei astrarre lo schema di blocco in classi separate o mi metterei in un sottaceto seguendo questa strada?
Aggiorna
Di seguito è riportata l'implementazione di una semplice classe di token di blocco. Questa è una classe privata in SimpleLockPolicy
e la politica crea un token facendo new SimpleLockToken(_syncLock)
quando un thread richiama i metodi EnterRead / EnterWrite.
class SimpleLockToken : IDisposable
{
private readonly object _lock;
public SyncLockToken(object syncLock)
{
_lock = syncLock;
Monitor.Enter(_lock);
}
public void Dispose()
{
Monitor.Exit(_lock);
}
}