2009-12-14 3 views
5

내가 좋아하는 것까지 :ServiceLocator와 오픈/청산 원리

  1. 확인 일반적으로 테스트 용이성을 희생하지 않고 그들을 필요로하는 모든 클래스, 보일러의 최소
  2. 볼 서비스를 필요 !

작은 프로젝트이며 DI가 과잉이라고 생각하지만 어쩌면 틀렸을 수도 있습니다. 그 멤버는 속성을 통해 메소드는 서비스에 액세스, 예를 들면 : 어쨌든, 나는 클라이언트 클래스에서 ServiceLocator pattern as described by Martin Fowler

을 중심으로 한 '

this->db = Locator::getDb(); 
this->log = Locator::getLogger(); 

그런 다음 클래스의 다른 생성자,이 같은 뭔가를' :

this->fooModel = new fooModel(this->db); 
fooItem1234 = this->fooModel->findById(1234); 

그러나 나는 것 또한 여러 다른 장소에서 액세스 할 하나 개 이상의 인스턴스를 가질 필요가 없기 때문에 (위 fooModel 같은) "모델"개체에 대한 가시성이 수준있다.

내 초기 생각은 Locator를 ::getFooModel()으로 확장하는 것이었지만 이제는 새로운 모델 클래스를 도입 할 때마다 Locator를 수정해야하므로 Open/Closed Principle을 위반하고있는 것으로 보입니다.

OCP를 만족시키기 위해 Fowler의 페이지에서도 설명 된 동적 서비스 찾기 기능을 사용할 수 있지만, 필자와 동일한 이유로 완전히 판매되지는 않습니다. 즉 충분하지 않습니다.

다른 해결책은 내 모델의 모든 메소드를 정적으로 만드는 것입니다. 따라서 :

fooItem1234 = FooModel::findById(1234); 

저는이 것이 상용구입니다. 새 모델 클래스를 만들고 어디서나 한 줄로 호출 할 수 있습니다. 그러나 이제 모델은 Locator에 따라 DB 연결을 찾았습니다. 어떻게 느끼는지 확실하지 않습니다. 필자가 별도의 데이터베이스 연결에서 두 개의 fooModel을 열어야 할 필요가 있다면 혼란 스럽거나 불가능할 것입니다. 즉, 실제로이 옵션을 현재 수행 할 필요가 없으므로이 옵션이 약간 유혹스러운 것처럼 보입니다.

마지막으로 DI가 있습니다. 그러나 내가 위에서 말했듯이,이 작은 프로젝트에서는 너무 많은 것 같아요.

결론 : 저는 여기에 조금 붙어있어 StackOverflow의 전문가로부터 조언을 얻었습니다.

답변

7

DI가 프로젝트에 과도하다고 생각하는 이유는 무엇입니까? 과 같은 DI 패턴 생성자 삽입은 Service Locator (반 패턴으로 생각 함)보다 간단하고 깨끗합니다.

서비스 로케이터는 종속성이 있어야하는 API 사용자에게 완전히 불투명하기 때문에 반 패턴으로 간주합니다. 따라서 Service Locator가 던져 버릴 컨텍스트에서 객체에 대한 메소드를 쉽게 호출 할 수 있으며 API를 통해이 경우에 대한 단서가 제공되지 않습니다.

DI를 사용하기 위해 DI 컨테이너가 필요하지 않습니다. 간단한 프로젝트가 있다면 불쌍한 사람의 DI을 사용하여 종속성을 수동으로 철저히 조사 할 수 있습니다.

+0

나는 DI가 잔인하다고 생각할 때 컨테이너를 사용했다는 것을 의미했다. 미안하다. 그리고 대답에 감사드립니다! 나는 당신이 Constructor Injection을 할 때 dbconn과 logger 객체를 의존하는 클래스의 생성자로 전달해야한다고 말하고 있습니다. 그렇다면 실제로 이것은 내가 한 일입니다. 그런 다음 어떤 이유로 모든 클래스의 생성자 프로토 타입에 로거를 추가해야한다고 생각했습니다. 하지만 이제는 당신이 그것에 대해 생각하게 만들었으니, 나는이 ServiceLocator로하려고했던 것보다 훨씬 더 의미가있는 것 같다. – oops

+1

차가움. 그런 다음 일반적으로 의존 관계를 쌓거나 감싸는 것입니다. 아마도 저수준 서비스가 많이있을 것입니다. 그러나 이들 중 두세 가지를 의미있는 객체에 랩핑 한 다음 세 가지 저수준 서비스 대신 이들 중 하나만 주입 할 수 있습니다. 개별 클래스에 대한 종속성 수를 줄이려면이 작업을 여러 번 반복 할 수 있습니다. –

+0

위의 예에서 DBconn과 logger와 같은 완전히 관련이없는 것들을 "config"라는 하나의 객체에 스태킹/래핑하는 것은 어떻습니까? 아니면 나쁜 형태입니까? – oops

3

... 하나 이상의 인스턴스를 가질 필요가 없습니다.

사과와 오렌지를 혼합하고 있습니다. 응용 프로그램에 대해 하나의 클래스 인스턴스 만 필요하다는 사실은 해당 인스턴스를 전역 적으로 사용 가능하게 만드는 것이 좋습니다. DI를 사용하면 카디널리티를 변경하지 않고 하나의 인스턴스 만 만들 수 있습니다. 당신이 바꾸는 것은 상기 인스턴스를 다루는 변수의 범위입니다. 차이점이 있습니다.

관련 문제