Como esse é um objeto de dados na camada de acesso a dados, ele deve depender diretamente de um serviço de banco de dados. Você pode especificar um DatabaseService para o construtor:
DataObject dataObject = new DataObject(new DatabaseService());
dataObject.Update();
Mas, a injeção não precisa estar no construtor. Como alternativa, você pode fornecer a dependência por meio de cada método CRUD. Prefiro esse método ao anterior, porque seu Data Object não precisa saber onde ele persistirá até que você realmente precise persistir.
DataObject dataObject = new DataObject();
dataObject.Update(new DatabaseService());
Você definitivamente não deseja ocultar a construção nos métodos CRUD!
public void Update()
{
// DON'T DO THIS!
using (DatabaseService dbService = new DatabaseService())
{
...
}
}
Uma opção alternativa seria construir o DatabaseService por meio de um método de classe substituível.
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())
{
...
}
}
Uma alternativa final é usar um ServiceLocator no estilo singleton. Embora eu não goste desta opção, ela é testável por unidade.
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())
{
...
}
}