이는 데이터 액세스 계층의 데이터 개체이므로 데이터베이스 서비스에 직접 의존해야합니다. 생성자에 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())
{
...
}
}