由于这是数据访问层中的数据对象,因此它应直接依赖于数据库服务。您可以为构造函数指定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())
{
...
}
}