2016-08-22 2 views
0

나는 의존성 주입으로 선택할 뼈가 있습니다. 그것은 그러한 단순한 개념이 많은 사람들 사이에서 많은 혼란을 일으키고있는 것처럼 보이며, '올바른'길은 복잡한면에서 통제 불능으로 보인다. 일이 정말 간단 유지에 그냥 알고 싶어PHP와 DIC의 의존성 삽입

function someObject() { 
    return new someObject(); 
} 

내가 매개 변수를 전달할 수 있습니다 : 그것은이 같은 내 종속성을 등록하는 표준 기능을 사용하면 좋은 연습,

인가?

class Dependencies { 
    function someObject($param1) { 
    return new someObject($param1); 
    } 
} 

그리고 사용 : 간단한 사용자 지정 컨테이너 클래스를 사용하는 방법에 대한 방법 마지막으로

function someObject($param1) { 
    return new someObject($param1); 
} 

class SomeClass { 
    public function __construct(Dependencies $dependencies) { 
    $this->dependencies = $dependencies 
    } 

    public function methodNeedsDependency() { 
    $param1 = 'one'; 
    $task = $this->dependencies->someObject($param1); 
    } 
} 

을 나는이 부탁 해요 무슨 생각이 괜찮은 시도에서이다 a 매우 간단 DIC 구현? 아니면 표면에 거품이 발생하는 몇 가지 근본적인 문제가 있습니까?

감사합니다.

답변

1

SomeClass이 공장이라면, 정확한 설정으로 인스턴스를 만들 수 있습니다. 그렇다면 DIC를 매우 간단하게 구현할 수 있습니다.

여기에 이슈가 있습니까? 자, 다른 생성자 매개 변수와 함께 someObject을 만들고 싶다고합시다.

솔루션 :

  1. 다른 PARAMS을 통과 할 또 다른 SomeClass 공장을 만듭니다. 또한 두 개의 응용 프로그램 계층 (개체 구성 계층을 통한 구성)을 혼합하는 중복 솔루션입니다.

  2. 매개 변수 methodNeedsDependencysomeObject으로 전달됩니다. 코드 구성 작성을 연기 할 수있는 기능입니다.

  3. 마지막이지만 가장 적절한 방법 : DIC는 유연해야하며 모든 종속성이있는 서비스 인스턴스를 만들 수 있어야하며 모든 구성을 구성 계층에 저장해야합니다. 관심사 분리 - DIC가 어떤 오브젝트 유형을 작성하는지 알지 못하게하십시오. 그가 다른 곳에 묘사 한 물건을 만들게하십시오.

다른 문제의 많은 당신은 전체 DIC에 대한 지정된 클래스의 인스턴스를하고 싶은 경우 어떻게 예를 들어 같은도 있습니다 (이것은 쉽게로는,하지만 그건 또 다른 해결 방법은 적절한에의 "만일" 솔루션) 또는 순환 참조가있는 경우.

이 토론은 "서비스는 무국적이어야합니다"와 같은 아키텍처와 관련된 다른 문제에 계속해서 적용될 수 있습니다. 물론 그것은 DIC에 대한 궁극적 인 메가 하이퍼 대답이 아님을 기억하십시오. 그것은 단지 그것을 보는 나의 방법입니다 ;-)

+0

간단하면서도 철저한 답변 ... 그래서 "정확한 설정으로 주어진 인스턴스를 _ 생성하십시오"라고 말하면 설정이 컨테이너 레벨에서 주어져야한다는 뜻입니까?또는 2 단계에서 언급 한 바와 같이 _ 매개 변수화 된 방법이 합리적입니까?이 단계가 나중에 인수로 전달됩니다. –

+1

구성을 지정해야합니다 ... 잘 구성 레이어 :) 구성 파일 (YAML, XML, TXT, 뭐든간에)을 만듭니다. 여기서 정확히 인스턴스로 전달할 내용을 말합니다. 좋은 예가 Symfony 컨테이너의 설정입니다. 서비스가 어떻게 정의되고 있는지 살펴보십시오. – mmmm