Comme il s'agit d'un objet de données dans la couche d'accès aux données, il doit dépendre directement d'un service de base de données. Vous pouvez spécifier un DatabaseService au constructeur:
DataObject dataObject = new DataObject(new DatabaseService());
dataObject.Update();
Mais, l'injection n'a pas besoin d'être dans le constructeur. Alternativement, vous pouvez fournir la dépendance via chaque méthode CRUD. Je préfère cette méthode à la précédente car votre objet de données n'a pas besoin de savoir où il persistera jusqu'à ce que vous ayez réellement besoin de le conserver.
DataObject dataObject = new DataObject();
dataObject.Update(new DatabaseService());
Vous ne voulez certainement pas cacher la construction dans les méthodes CRUD!
public void Update()
{
// DON'T DO THIS!
using (DatabaseService dbService = new DatabaseService())
{
...
}
}
Une autre option serait de construire le DatabaseService via une méthode de classe surchargeable.
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())
{
...
}
}
Une dernière alternative consiste à utiliser un ServiceLocator de style singleton. Bien que je n'aime pas cette option, elle est testable à l'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())
{
...
}
}