2014-01-31 3 views
1

나는 의존성 주입 이론에 대해 많은 연구를 해왔다. 특정 시나리오에서는 복잡성/부풀림을 초래하는 것 외에는 큰 의미가있다.PHP Dependedncy Injection & Complexity

먼저 DI 컨테이너 인스턴스가 어떤 객체에도 전달되지 않는다고 가정합니다. 나쁜 습관과 그 모든 것들 ...

예 : 특정 사용자가 시스템에서 작성한 다른 모든 비즈니스 오브젝트와 관련된 "사용자"클래스를 고려하십시오.

사용자 인스턴스를 삭제하려는 경우 관련된 모든 개체 (예 : 레코드, 파일, 이미지 등)도 삭제해야합니다. 이것은 모든 관련 객체의 조회 및 삭제를 허용하기 위해 각 종속성의 인스턴스가 사용자 인스턴스에 삽입된다는 것을 의미합니까? 즉, 삭제되는 사용자 인스턴스에 의해 생성/업로드 된 모든 이미지를 삭제하려면 ImageMapper (또는 ImageMapperFactory)의 인스턴스를 전달해야합니다.

그렇지 않은 경우 이러한 시나리오는 서비스 로케이터를 사용해야하는 좋은 예입니까?

기사 & 자습서에서 프로그래머는 전염병과 같은 모든 클래스에서 "new"를 사용하지 말아야한다는 것을 반복해서 되풀이합니다. 그러나 다양한보기를 작성해야하는 제어기의 경우에는 이것이 실제로 가능합니까?

최소한 DI와 관련하여 SOLID mantra를 준수하는 구체적인 예가 인정 될 것입니다. 컨트롤러 클래스에 필요한 모든 의존성의 인스턴스를 채우는 방법이나 그러한 종속성의 최상의 인스턴스가 위치하거나 생성됩니까?

답변

0

PHP는 잘 모르지만 몇 가지 사항을 설명하려고합니다. 질문을 무시하지 않도록 나와 함께 맨다. - 응용 프로그램과의 상호 작용을 제공하는 일부 (사용자) 인터페이스

  • 프리젠 테이션 레이어 : ;-)

    나는 의존성 주입 층에서 응용 프로그램을 분리하여 가장 적합한 것을 찾을 수 있습니다.

  • 비즈니스 로직/서비스 계층 - 응용 프로그램의 실제 동작입니다.
  • 지속성/데이터 액세스 계층 - 백엔드에서 데이터를 저장/읽는 계층 (저장소 패턴 검색).

이 모든 레이어는 도메인 모델을 사용하여 구조화 된 방식으로 서로 데이터를 서로 전송합니다. 이러한 모델은 예를 들어 사용자 및 이미지 일 수 있습니다.

응용 프로그램 논리에서 사용자가 삭제 될 때 사용자의 이미지가 삭제된다고 말하면 중간 계층 (비즈니스 로직)에이 이미지가 필요합니다. 비즈니스 로직 계층은 엔터티를 삭제하기 위해 데이터 액세스 계층을 호출합니다.

파이썬을 사용하여 시연 해 봅시다 (필자가 읽을 수 있기를 바랍니다).

# Define a class that manages users. 
class UserService: 
    # A constructor accepting dependent DAL instances. 
    def __init__(self, user_repo, image_repo): 
     self.user_repo = user_repo 
     self.image_repo = image_repo 

    def delete(self, user): 
     self.user_repo.delete(user) 
     self.image_repo.delete(user.profile_picture) 

생성자에 포함 된 repo 인수는 저장소 클래스의 인스턴스입니다. 이것은 종속성 주입 (생성자 삽입)입니다.

기억해야 할 중요한 점은 객체가 다른 객체를 인스턴스화하지 않고 객체의 인스턴스를 허용한다는 점입니다.

+0

siebz0r, 문제에 대한 연구를 계속하면서 천천히 내린 결론을 확인했습니다. 특히 서비스 계층 :) 저는 Bob (삼촌)의 "클래스/객체 이름에 동사 없음"규칙의 위반을지지한다고 확신했기 때문에 서비스 계층의 개념에 회의적이었습니다. 계속 ... – Nibbl3r

+0

그러나 서비스 레이어/애스펙트가 모델이 도메인 데이터 객체를 나타내며 자신을 "인식"(예 : SOLID)하고 서비스 레이어 핸들 논리적으로 생각한다면 "얇은 컨트롤러와 뚱뚱한 모델"을 의미하는 비즈니스 로직입니다. "뚱뚱한"모델은 단 하나 책임 원리를 나타내거나/지원하기 위하여 예정된다 imho & 너가 buss을 다만 부딪히면 안된다 아이디어에 늘인다. 컨트롤러에서 모델로의 논리가 아니라 서비스 계층이 완벽한 의미를 갖도록 우려를 분리합니다. – Nibbl3r

+0

데이터 맵퍼가있을 때 저장소 패턴의 관련성/적용 가능성에 대해 여전히 숙고하고 있습니다. 저장소는 단지 도메인 개체의 여러 인스턴스를 가져오고 표시하는 것을 종종 고려하지만 한 번에 하나의 인스턴스 만 조작 (예 : 편집/업데이트)하므로 데이터 매퍼를 그렇게 보이게 만듭니다 잘 어울린다. – Nibbl3r