Poiché questo è 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 si manterrà finché non avrai effettivamente bisogno di persisterlo.
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 costruire il DatabaseService tramite un metodo di classe sovrascrivibile.
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'alternativa finale è usare un ServiceLocator in stile singleton. Anche se non mi piace questa opzione, è unità testabile.
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())
{
...
}
}