เนื่องจากนี่คือ Data Object ใน data access layer มันควรขึ้นอยู่กับบริการฐานข้อมูลโดยตรง คุณสามารถระบุ 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 ด้วยวิธีการเรียนแบบ overridable
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())
{
...
}
}