2010-02-19 3 views
5

데이터베이스 로직이 포함 된 정적 클래스가 있습니다.어떻게 정적 클래스를 정적으로 만들지 않습니까?

이 클래스는 웹 사이트, 웹 서비스 및 미들웨어 구성 요소의 일부로 사용됩니다.

이 클래스의 모든 메소드에 대해 호출자로부터 컨텍스트 정보가 필요합니다. 웹 사이트의 경우 이것은 사용자 정보 일 것이며, 웹 서비스 및 미들웨어 구성 요소의 경우 이것은 호출 서비스를 식별합니다.

이 값은 사용자마다 다를 수 있기 때문에이 값을 config에 저장할 수 없으며이 값을 얻으려는 httpcontext가 항상있는 것은 아닙니다.

이 클래스의 모든 메소드에 새 매개 변수를 쉽게 추가 할 수 있습니다. 또는 정적 클래스에서 변경할 수 있기 때문에 하나의 비 정적 속성이 있지만 그 솔루션 중 어느 것도 매우 우아하지는 않습니다.

내가 고려하지 않은 다른 옵션이 있습니까?

+3

위대한 제목 ^^ "어떻게 내 싱글 톤을 싱글 톤이 아니게 만들 수 있습니까?" – tanascius

+0

@tanascius - 귀중한 +1은 내가 줄 수있는 모든 것을 유발합니다. @ 크리스, 전략을 다시 생각해 볼 수도 있습니다. 일반적으로 전면적 인 담요 진술에서 나는 '정적 DAL이 문제를 요구하고있다'고 말할 것입니다. .2 페소. –

+0

@Sky 샌더스 - 머리카락을 여기에서 나눌 수 있지만 DAL은 SQL 클래스에 대한 linq입니다. 이것이 제 데이터베이스 로직입니다. 이미 답변을 수락하고 비 정적 경로를 거쳤다는 사실을 무시하고 "문제를 묻습니다"진술을 수락 할 수 있습니까? 왜 정적 클래스가 나쁜 생각입니까? –

답변

6

모든 메서드에 상태가 필요하면 인스턴스를 생성하고 생성자를 통해 해당 상태를 전달하십시오.

디자인을 여러 정적 메소드에서 인스턴스로 변경하면 클래스 테스트가 더 쉬워집니다.

+0

더 생각하면할수록 더 많이 생각하게됩니다. 유일한 단점은 메서드 호출이 필요할 때마다 필요한 추가 코드 줄입니다. –

+0

+1 - 이것은 종속성 주입/IoC (수동 또는 컨테이너 프레임 워크를 통한)의 전형적인 사례입니다. http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052 – TrueWill

+0

각 호출에 대해 인스턴스를 만드시겠습니까? 그렇지 않으면 인스턴스를 사용하여 추가 코드가 필요한 방법을 알 수 없습니다. –

1

매개 변수를 추가합니다. 나에게보기 싫은 것처럼 보이지 않습니다. 컨텍스트 정보가 필요합니다. 정적 클래스에서이 정보를 전달하는 유일한 방법은 전달하는 것입니다.

+1

이 문제는 나에게별로 안좋은 것처럼 보입니다. –

+0

필자는 DRY를 위반 한 것으로 보지 않습니다. 정적 클래스를 유지하든 인스턴스 생성으로 전환하든이 메소드에는 컨텍스트 정보가 필요합니다. 매개 변수 나 인스턴스 멤버에서 가져옵니다. 나도 문제가 아닌 것처럼 보입니다. db 미들웨어의 일부이며 컨텍스트의 일부가 아닌 클래스의 경우 정적 클래스가 더 적절하다고 생각합니다. 또한 정적 클래스가 매우 크고 컨텍스트 데이터가 매우 작 으면 정적 클래스를 유지합니다. – Ray

+0

모든 메소드는 개인용 메소드를 사용하여 연결을 설정합니다. 컨텍스트 정보를 사용하고 있기 때문에 각 메서드가 미묘한 차이를 느끼면 컨텍스트를 "직접"사용하지 않습니다. 모든 매개 변수에이 매개 변수를 적용한 다음 개인 메서드로 전달하면 나에게 반복되는 것처럼 들립니다. –

관련 문제