【问题标题】:Modifiers not visible under objects from services修饰符在服务对象下不可见
【发布时间】:2018-01-02 06:13:27
【问题描述】:

鉴于以下情况:

  • 哞2.001001;
  • 面包::Board 0.34;
  • Bread::Board 容器
  • 基类Foo 带有属性straround 修饰符用于str
  • 子类Bar 扩展Foo

问题:

  • [GOOD] 从普通Bar 实例化对象时,会执行Foo::str 修饰符;
  • [BAD] 从容器服务为Bar 实例化对象时,Foo::str 修饰符未执行;
  • 在 [BAD] 发生后 [WORSE],从普通的 Bar 实例化也不再有效;

代码示例:

#!/usr/qlc/apps/common/perl_5.18.2/bin/perl -w

package Foo;

use Moo;

has str => ( is => 'rw', default => '' );

sub BUILD {
    my ($self, $args) = @_;

    $self->str($self->str);
}

around str => sub {
    my ($orig, $self, $val) = @_;

    return $self->$orig unless defined $val;

    $self->$orig('prefix_'.$val);
};
# end of Foo



package Bar;

use Moo;

extends 'Foo';
# end of Bar



package main;

use 5.010;
use strictures 2;

use Bread::Board;

my $c = container 'MyApp' => as {
    service 'foo' => ( class => 'Foo', parameters => { str => { optional => 1 } } );
    service 'bar' => ( class => 'Bar', parameters => { str => { optional => 1 } } );
};


my $foo_plain = Foo->new({ str => 'foo_plain' });
say "foo_plain = ".$foo_plain->str;

my $foo_bb = $c->resolve( service => 'foo', parameters => { str => 'foo_bb' } );
say "foo_bb = ".$foo_bb->str;

$foo_bb->str('foo_bb_setter');
say "foo_bb_setter = ".$foo_bb->str;

my $foo_plain_after_bb = Foo->new({ str => 'foo_plain_after_bb' });
say "foo_plain_after_bb = ".$foo_plain_after_bb->str;


my $bar_plain = Bar->new({ str => 'bar_plain' });
say "bar_plain = ".$bar_plain->str;

my $bar_bb = $c->resolve( service => 'bar', parameters => { str => 'bar_bb' } );
say "bar_bb = ".$bar_bb->str;

$bar_bb->str('bar_bb_setter');
say "bar_bb_setter = ".$bar_bb->str;

my $bar_plain_after_bb = Bar->new({ str => 'bar_plain_after_bb' });
say "bar_plain_after_bb = ".$bar_plain_after_bb->str;


die;

输出:

foo_plain = prefix_foo_plain
foo_bb = prefix_foo_bb
foo_bb_setter = prefix_foo_bb_setter
foo_plain_after_bb = prefix_foo_plain_after_bb
bar_plain = prefix_bar_plain
bar_bb = bar_bb
bar_bb_setter = bar_bb_setter
bar_plain_after_bb = bar_plain_after_bb

请注意输出 bar_bbbar_bb_setterbar_plain_after_bb 不包含 prefix_ 字符串。

为什么?

【问题讨论】:

标签: perl moo bread-board


【解决方案1】:

这是 Bread::Board 中的一个错误。

固定在this commit

谢谢@Yanick

【讨论】:

    猜你喜欢
    • 2019-03-24
    • 2013-09-25
    • 1970-01-01
    • 2013-05-19
    • 2018-06-02
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    • 2019-11-13
    相关资源
    最近更新 更多