데이터베이스와 인터페이스하는 정적 메소드를 사용하여 잠재적 인 문제점은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/8978757

문제

MVC3 / .NET 응용 프로그램에 대한 데이터베이스 액세스를 수업하고 있습니다.

클래스는 정적이며 일반적인 DB 쿼리 - "getColumnBvalueforColumna ()"과 같은 모든 종류의 모든 종류의 모든 종류의 재료뿐만 아니라 훨씬 복잡한 쿼리를 제공합니다.주어진 솔루션 및 도메인에 대해 잘 알고 있거나 최적화되었습니다.

클래스를 정적으로 보는 것으로 비록, 이것이 나쁜 아이디어 (멀티 스레딩의 맥락에서)가 있는지에 대해 잊어 버린 기억을 잊어 버렸습니다. 그리고 나는 느낌을 흔들 수 없습니다.

이 종류의 클래스를 정적으로 유지하거나 각 데이터베이스 호출에 대해 인스턴스화해야합니까?

도움이 되었습니까?

해결책

이런 종류의 계급을 정적으로 유지하는 것이 좋습니다. 각 데이터베이스 호출에 대한 인스턴스화?

응용 프로그램의 레이어 사이의 약한 결합, 해당 레이어의 재사용 가능성, 단위 테스트는 위의 것 중 하나를 수행해서는 안됩니다.당신은 추상화로 일해야합니다.

해당 것들을 상관하지 않으면 정적 방법이 괜찮습니다.정적 방법으로 작업 할 때 조심해야 할 유일한 것은 Reentrant 스레드 안전을 위해 모든 공유 상태에 의존하지 마십시오.모든 경우 명령문을 사용하여 데이터베이스 연결 및 명령과 같은 모든 IDisposable 리소스를 적절하게 폐기하십시오.

다른 팁

이 종류의 클래스를 정적으로 유지하거나 각 데이터베이스 호출에 대해 인스턴스화해야합니까?

이들은 단 두 가지 옵션이 아닙니다.

클래스는 이 아닙니다 정적으로 : static 몇 가지 중요한 이점을 포기합니다 객체 지향 프로그래밍의 경우 실제로 아무 것도 얻지 못합니다.

대신 생성자 기반 종속성 주입을 통해 컨트롤러에 대한 인스턴스가 제공되어야합니다. 각 요청에 대해 클래스가 다시 인스턴스화되었는지 또는 싱글 톤을 사용하여 종료할지 여부는 DI 바인딩 코드에 의해 결정됩니다. 모자 한 방울에서 그것을 바꿀 수 있습니다.

여기에 몇 가지 장점이 있습니다 :

  1. 이 데이터 액세스 클래스를 사용하는 방법을 단위 테스트하려고합니다. 정적 메서드를 직접 호출하는 대신 주입 된 서비스 인터페이스 을 사용하는 경우 모의 개체를 만들고, 작동하는 방법을 알리고, 유닛 테스트가 실제로 생각하는 방법을 허용 할 수 있습니다. 사실 실제로 테스트하려는 데이터를 먹이기 만하면됩니다.
  2. 는 데이터 액세스 호출의 결과를 캐시하려고하고 싶습니다. 캐시 된 값이 없을 때 캐시 된 결과를 반환하고 캐시 된 값이 없을 때 실제 데이터 액세스 메소드를 호출하는 캐시 클래스를 주입 할 수 있습니다. 이 중 어느 것도 데이터 액세스 클래스를 변경해야합니다.

    나는 계속 될 수 있었다. 정적 수업은 당신의 유연성을 죽이고 99 %의 시간의 실제 이점을 가지고 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top