2013-04-24 3 views
4

종속성 주입과 관련하여 제가 해결하고자하는 몇 가지 문제가 있습니다. 언급 된 첫 번째 것은 구현 된 의존성 주입 컨테이너 (DIC)입니다.이 컨테이너는 ReflectionClass을 사용하여 생성자를 통해 종속성을 등록하고 해결할 수 있습니다.PHP에서 종속성을 올바르게 삽입하는 방법

$container = new DiC; 
$container->register('session', 'CSession'); 
$container->register('response', 'CResponse'); 
$container->register('model', 'CSomeModel'); 
$container->register('view', 'CSomeView'); 
$container->register('controller', 'CSomeController'); 

종속 컨트롤러 :

class CSomeController extends CController 
{ 
    public function __construct(CSomeModel $model, CSomeView $view) 
    { 
    // assign arguments here 
    } 
} 

이제 컨트롤러가 DIC를 통해 인스턴스화 할 수 있습니다 : 그것은 자동화 설명되어 있기 때문에

$controller = $container->resolve('controller'); 

나는이 방법을 좋아한다, 그러나 클래스 CController에 의존 특정 클래스 CSomeModel, 나쁜 CSomeView. MVC 트라이어드는 독립적으로 인스턴스화해야합니다. - 예를 들어 CStherController에 COtherView를 전달할 수 없습니다.

내 두 번째 추측은 DIC를 주입하는 것입니다

class CSomeController extends CController 
{ 
    public function __construct(DiC $dic) 
    { 
    // resolve dependencies through $dic 
    } 
} 

이 사람은 DIC 글로벌, 많은 사람들이 DI를 구현하는 방법이 아니다 주장 개체 수 있습니다.

두 가지 방법의 약점을 제거하는 세 번째 방법이 있습니까?

+0

'DiC' 수업을 게시 하시겠습니까? –

+1

[Laravel4] (http://four.laravel.com/docs/ioc)가이를 처리하는 방법, 특히 "구현에 대한 인터페이스 바인딩"세션을 살펴 봐야합니다. 관련 소스는 [Github] (https://github.com/laravel/framework/blob/master/src/Illuminate/Container/Container.php) – vFragosop

+0

에서 찾을 수 있습니다. Symfony2는 Java 기반의 매우 견고한 DI 구성 요소를 사용합니다 Spring ... 이것은 당신이하고있는 것과 비슷합니다 .. 더 나아가는 것 .. http://symfony.com/doc/2.0/components/dependency_injection/introduction.html – Dinesh

답변

1

"자동 배선"을 찾으려면 인터페이스로 전환하고 구체적인 모델 /보기/등을 구현하십시오. 클래스를 해당 인터페이스와 비교합니다. 그렇게하면 반사를 사용하여 양면을 짝을 지을 수 있습니다.

또한 컨테이너 수준에서 명시 적으로 종속성을 지정하는 메커니즘이있는 것이 좋습니다.

+0

여기 어딘가에 자습서가 있습니까? –

1

두 방법 모두 관련이 있다고 생각합니다. 첫 번째 접근 방식에서 좀 더 유연 해지기를 원하면 생성자를 변경하여 상위 클래스를 종속으로 사용할 수 있습니다. 그런 다음 부모 클래스에서 상속 한 모든 객체를 주입 할 수 있습니다. 나는.

class CSomeModel extends AbstractCModel {} 
class CSomeOtherModel extends AbstractCModel {} 

public function __construct(AbstractCModel $model, AbstractCView $view) {} 

두 번째 방법은 공장에 액세스해야하는 경우 적합합니다. 나는. 동일한 객체의 여러 인스턴스에 액세스해야하는 경우

+1

IoC 클래스는 PHP Reflection을 사용하여 의존성을 해결합니다. 추상 클래스를 주입함으로써 자동화가 느슨해졌습니다. – user1517081

+0

인터페이스는 추상 클래스보다 낫습니다. –

관련 문제