问题描述
|
使用
Moose
和Bread::Board
,可以创建一个对象,该对象的属性具有类型ArrayRef[SomeObject]
约束,并且可以通过以下方式注入该参数:
维持ArrayRef
约束,
属于ArrayRef成员的每个对象都具有Bread::Board
满足的所有依赖关系,并且
属于ArrayRef成员的每个对象都是由“ 1”创建的对象。
为了确保我清楚地解释自己,让我们考虑一个令人难以置信的天真例子。假设我们有一个Wheel
类:
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\');
有任何想法吗?是的,我知道我的ѭ8可以没有轮子,并且我正在尝试制造单轮轿车,但我想您明白我的意思。 :-)这仅是一个非常简单的例子。
解决方法
您可以获取carTires服务以返回Wheels的ArrayRef:
container \'wheels\' => as {
service \'carTires\' => (
block => sub {
return [ map {Wheel->new} 1..4 ];
},)
};
Vehicle构造函数将根据类型约束来处理其余部分,因为您已经将其定义为ArrayRef [Wheel]。
因此,如果您改为这样做,它将死:
container \'wheels\' => as {
service \'carTires\' => (
block => sub {
return [ map {Window->new} 1..4 ];
},)
};