Da dies ein Datenobjekt in der Datenzugriffsschicht ist, sollte es direkt von einem Datenbankdienst abhängen. Sie können dem Konstruktor einen DatabaseService angeben:
DataObject dataObject = new DataObject(new DatabaseService());
dataObject.Update();
Die Injektion muss sich jedoch nicht im Konstruktor befinden. Alternativ können Sie die Abhängigkeit über jede CRUD-Methode bereitstellen. Ich bevorzuge diese Methode gegenüber der vorherigen, da Ihr Datenobjekt nicht wissen muss, wo es bestehen bleibt, bis Sie es tatsächlich beibehalten müssen.
DataObject dataObject = new DataObject();
dataObject.Update(new DatabaseService());
Sie möchten die Konstruktion definitiv nicht in den CRUD-Methoden verstecken!
public void Update()
{
// DON'T DO THIS!
using (DatabaseService dbService = new DatabaseService())
{
...
}
}
Eine alternative Option wäre, den DatabaseService über eine überschreibbare Klassenmethode zu erstellen.
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())
{
...
}
}
Eine letzte Alternative ist die Verwendung eines ServiceLocator im Singleton-Stil. Obwohl ich diese Option nicht mag, ist sie einheitlich testbar.
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())
{
...
}
}