微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Bread :: Board-注入具有ArrayRef类型约束的参数吗?

如何解决Bread :: Board-注入具有ArrayRef类型约束的参数吗?

| 使用
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 ];
        },)
};
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。