Poiché si tratta di un oggetto dati nel livello di accesso ai dati, dovrebbe dipendere direttamente da un servizio di database. È possibile specificare un DatabaseService per il costruttore:
DataObject dataObject = new DataObject(new DatabaseService());
dataObject.Update();
Ma l'iniezione non deve essere nel costruttore. In alternativa, è possibile fornire la dipendenza tramite ciascun metodo CRUD. Preferisco questo metodo al precedente perché il tuo oggetto dati non ha bisogno di sapere dove persisterà fino a quando non dovrai effettivamente persistere.
DataObject dataObject = new DataObject();
dataObject.Update(new DatabaseService());
Sicuramente non vuoi nascondere la costruzione nei metodi CRUD!
public void Update()
{
// DON'T DO THIS!
using (DatabaseService dbService = new DatabaseService())
{
...
}
}
Un'opzione alternativa sarebbe quella di costruire DatabaseService tramite un metodo di classe sostituibile.
public void Update()
{
// GetDatabaseService() is protected virtual, so in unit testing
// you can subclass the Data Object and return your own
// MockDatabaseService.
using (DatabaseService dbService = GetDatabaseService())
{
...
}
}
Un'ultima alternativa è utilizzare un ServiceLocator in stile singleton. Sebbene questa opzione non mi piaccia, è testabile in unità.
public void Update()
{
// The ServiceLocator would not be a real singleton. It would have a setter
// property so that unit tests can swap it out with a mock implementation
// for unit tests.
using (DatabaseService dbService = ServiceLocator.GetDatabaseService())
{
...
}
}