내가 좋아하는 것까지 :ServiceLocator와 오픈/청산 원리
- 확인 일반적으로 테스트 용이성을 희생하지 않고 그들을 필요로하는 모든 클래스, 보일러의 최소
- 및
- 볼 서비스를 필요 !
작은 프로젝트이며 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의 전문가로부터 조언을 얻었습니다.
나는 DI가 잔인하다고 생각할 때 컨테이너를 사용했다는 것을 의미했다. 미안하다. 그리고 대답에 감사드립니다! 나는 당신이 Constructor Injection을 할 때 dbconn과 logger 객체를 의존하는 클래스의 생성자로 전달해야한다고 말하고 있습니다. 그렇다면 실제로 이것은 내가 한 일입니다. 그런 다음 어떤 이유로 모든 클래스의 생성자 프로토 타입에 로거를 추가해야한다고 생각했습니다. 하지만 이제는 당신이 그것에 대해 생각하게 만들었으니, 나는이 ServiceLocator로하려고했던 것보다 훨씬 더 의미가있는 것 같다. – oops
차가움. 그런 다음 일반적으로 의존 관계를 쌓거나 감싸는 것입니다. 아마도 저수준 서비스가 많이있을 것입니다. 그러나 이들 중 두세 가지를 의미있는 객체에 랩핑 한 다음 세 가지 저수준 서비스 대신 이들 중 하나만 주입 할 수 있습니다. 개별 클래스에 대한 종속성 수를 줄이려면이 작업을 여러 번 반복 할 수 있습니다. –
위의 예에서 DBconn과 logger와 같은 완전히 관련이없는 것들을 "config"라는 하나의 객체에 스태킹/래핑하는 것은 어떻습니까? 아니면 나쁜 형태입니까? – oops