Lo considererei un'odore dell'architettura in quel UpdateData probabilmente dovrebbe appartenere a una classe di "servizio".
Dove i dati sono una mela.
Dove AppleAdapter è di classe servizio / business-intelligence.
Dove AppleService è un riferimento Singleton ad un AppleAdapter che esiste al di fuori del metodo corrente.
private static volatile AppleAdapter _appleService = null;
private static object _appleServiceLock = new object();
private AppleAdapter AppleService
{
get
{
if (_appleService == null)
{
lock (_appleServiceLock)
{
if (_appleService == null)
_appleService = new AppleAdapter();
}
}
return _appleService;
}
}
public SomeAppleRelatedMethod(Apple apple)
{
AppleService.UpdateData(apple);
}
Non penso che quello che stai facendo sia necessariamente sbagliato, ma se SomeDataAdapter rappresenta davvero un qualche tipo di servizio aziendale stateless, allora un singleton sarebbe la migliore pratica per questo.
Spero che sia d'aiuto! L'esempio fornito è un modo ingegnoso per garantire l'assenza di contesa di _appleService nel caso in cui sia accaduto sia nullo sia accesso allo stesso tempo da due o più thread.
Sai cosa? Se SomeDataAdapter è un ADO IDbDataAdapter (che è quasi certamente), trascura questa intera risposta!
:
Non ho il permesso di aggiungere un commento alla domanda originale, ma se potessi specificare dove esiste questo codice.
Se questo codice rappresenta un'implementazione personalizzata di un IDbDataAdapter e UpdateData sta creando un IDbConnection, IDbCommand e il cablaggio di tutto dietro le quinte, quindi no non considererei un odore di codice perché ora stiamo parlando di flussi e altre cose che devono essere smaltiti quando abbiamo finito di usarli.