2011-06-14 4 views
3

MooseBread::Board을 사용하면 ArrayRef[SomeObject] 유형 제약 조건이있는 속성을 가진 객체를 만들 수 있으며 다음과 같은 방법으로 해당 매개 변수를 삽입 할 수 있습니다.Bread :: Board - ArrayRef 형식 제약 조건을 가진 매개 변수 삽입?

  • ArrayRef 제약 조건이 유지됩니다.
  • 해당 ArrayRef의 멤버 인 각 개체는 Bread::Board
  • 에 의해 충족되는 모든 종속성을 갖습니다. 해당 ArrayRef의 멤버 인 각 개체는 Bread::Board에 의해 만들어진 개체입니까?

자신을 명확하게 설명 할 수 있도록하기 위해 믿을 수 없을 정도로 순진한 예를 생각해 봅시다.

클래스
package Wheel; 
use Moose; 

has ['size', 'maker'] => (isa => 'Str', is => 'rw', required => 1); 

각 인스턴스에 휠이 많이 포함되어있는 Vehicle 클래스를 만듭니다.

package Vehicle; 
use Moose; 

has 'wheels' => (
    is => 'rw', 
    isa => 'ArrayRef[Wheel]', 
    required => 1, 
); 

그러면 Wheel 인스턴스를 하나 이상 만들 수 있습니까? 그런 다음 해당 인스턴스를 포함하는 배열 참조를 새로운 Vehicle 인스턴스에 삽입하십시오. 이것은 분명히 작동하지 않습니다 :

my $c = container 'app' => as { 
    container 'wheels' => as { 
     service 'maker' => "Bob's Tires"; 
     service 'size' => "195R65/15"; 
     service 'carTires' => (
      class => 'Wheel', 
      dependencies => [ depends_on('maker'), depends_on('size') ], 
     ) 
    }; 

    container 'vehicles' => as { 
     service 'sedan' => (
      class => 'Vehicle', 
      dependencies => { 
       # WON'T WORK 
       wheels => depends_on('/wheels/carTires'), 
      } 
     ) 
    }; 
}; 
my $v = $c->resolve(service => 'vehicles/sedan'); 

어떤 아이디어? 예, 저는 제 Vehicle에 휠이 없으며 1 륜 세단을 만들려고 노력하고 있다는 것을 알고 있습니다.하지만 제 생각에는 당신이 생각합니다. :-) 이것은 아주 단순한 예일뿐입니다.

+0

이 오래, 그리고 긴 대답을 입력하고 싶지 않지만, [공급자를 사용하여 내 블로그 게시물 (HTTP ://www.xenoterracide.com/2013/10/providing-with-providers-and-breadboard.html)이 같은 문제를 해결하는 데 도움이 될 수 있습니다 – xenoterracide

답변

4

당신은 바퀴의 ArrayRef를 반환 할 carTires 서비스를받을 수있다 :

이미 ArrayRef [로 정의한 이후 차량 생성자, 유형 제약의 측면에서 알아서합니다
container 'wheels' => as { 
    service 'carTires' => (
     block => sub { 
      return [ map {Wheel->new} 1..4 ]; 
     }, 
    ) 
}; 

바퀴].

그래서 당신이 대신 한 경우가 죽을 :

container 'wheels' => as { 
    service 'carTires' => (
     block => sub { 
      return [ map {Window->new} 1..4 ]; 
     }, 
    ) 
}; 
+0

이 답변을 주셔서 감사합니다! 필자는 원래의 질문에 '휠 (Wheel)'도 의존해야하는 추가주의 사항을 추가했다. 블럭 주입을 비슷한 방식으로 사용하는 것이 올바른 해결책 일까? – 9numbernine9

+0

블럭 주입이 당신이 할 수있는 일의 측면에서 가장 유연하기 때문에 나는 그렇게 생각할 것입니다. 다른 주입 메소드의 문제점은 여러 객체 인스턴스의 ArrayRef를 생성하기 위해 어디에서 사용할 수 있는지 알 수 없다는 것입니다. – stevenl

관련 문제