これはデータアクセス層のデータオブジェクトなので、データベースサービスに直接依存する必要があります。DatabaseServiceをコンストラクターに指定できます。
DataObject dataObject = new DataObject(new DatabaseService());
dataObject.Update();
ただし、インジェクションはコンストラクタ内にある必要はありません。または、各CRUDメソッドを介して依存関係を提供できます。データオブジェクトは、実際に永続化する必要があるまで、どこに永続化するかを知る必要がないため、以前よりもこの方法を好んでいます。
DataObject dataObject = new DataObject();
dataObject.Update(new DatabaseService());
CRUDメソッドで構造を隠したくないことは間違いありません!
public void Update()
{
// DON'T DO THIS!
using (DatabaseService dbService = new DatabaseService())
{
...
}
}
別のオプションは、オーバーライド可能なクラスメソッドを介してDatabaseServiceを構築することです。
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())
{
...
}
}
最後の選択肢は、シングルトンスタイルのServiceLocatorを使用することです。私はこのオプションが嫌いですが、単体テスト可能です。
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())
{
...
}
}