Como se trata de un objeto de datos en la capa de acceso a datos, debe depender directamente de un servicio de base de datos. Puede especificar un DatabaseService para el constructor:
DataObject dataObject = new DataObject(new DatabaseService());
dataObject.Update();
Pero, la inyección no tiene que estar en el constructor. Alternativamente, puede proporcionar la dependencia a través de cada método CRUD. Prefiero este método al anterior porque su objeto de datos no necesita saber dónde persistirá hasta que realmente necesite persistirlo.
DataObject dataObject = new DataObject();
dataObject.Update(new DatabaseService());
¡Definitivamente no quieres ocultar la construcción en los métodos CRUD!
public void Update()
{
// DON'T DO THIS!
using (DatabaseService dbService = new DatabaseService())
{
...
}
}
Una opción alternativa sería construir el DatabaseService a través de un método de clase reemplazable.
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())
{
...
}
}
Una alternativa final es usar un ServiceLocator de estilo singleton. Aunque no me gusta esta opción, es comprobable por unidad.
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())
{
...
}
}