Vì đây là Đối tượng dữ liệu trong lớp truy cập dữ liệu, nên nó phụ thuộc trực tiếp vào dịch vụ cơ sở dữ liệu. Bạn có thể chỉ định một dịch vụ cơ sở dữ liệu cho nhà xây dựng:
DataObject dataObject = new DataObject(new DatabaseService());
dataObject.Update();
Nhưng, mũi tiêm không phải ở trong hàm tạo. Ngoài ra, bạn có thể cung cấp sự phụ thuộc thông qua mỗi phương pháp CRUD. Tôi thích phương pháp này hơn trước vì Đối tượng dữ liệu của bạn không cần biết nó sẽ tồn tại ở đâu cho đến khi bạn thực sự cần phải duy trì nó.
DataObject dataObject = new DataObject();
dataObject.Update(new DatabaseService());
Bạn chắc chắn không muốn che giấu việc xây dựng trong các phương pháp CRUD!
public void Update()
{
// DON'T DO THIS!
using (DatabaseService dbService = new DatabaseService())
{
...
}
}
Một tùy chọn thay thế sẽ là xây dựng DatabaseService thông qua một phương thức lớp có thể ghi đè.
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())
{
...
}
}
Một lựa chọn cuối cùng là sử dụng ServiceLocator kiểu đơn. Mặc dù tôi không thích tùy chọn này, nó là đơn vị thử nghiệm.
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())
{
...
}
}