【问题标题】:default/replacable values in Bread::Board面包板中的默认/可替换值
【发布时间】:2012-03-29 00:27:21
【问题描述】:

我发现自己在许多测试中都实例化了相同的对象,因此我尝试使用Bread::Board 替换这个常量设置。大多数时候,我希望依赖项具有相同的配置。但有时我可能希望使用非默认参数创建一个实例。在创建容器实例后,我还希望能够更改它。例如我通常想要

my $c = Test::Container->new;

my $bar = $c->resolve( service => 'bar' ); # where bar depends on foo

但有时我真正需要的是类似的东西

my $bar = $c->resolve( service => 'bar', {
              services => {
                foo => { init => 'arg' }
              }
          }

以便在创建 bar 的实例时以不同方式初始化服务 foo。

【问题讨论】:

    标签: perl inversion-of-control moose bread-board


    【解决方案1】:

    这是由#moose 上的Jesse Luehrs (Doy) 提供给我的,它似乎可以满足我的需求。

    #!/usr/bin/env perl
    use v5.14;
    use strict;
    use warnings;
    
    package Container {
    use Moose;
    use Bread::Board;
    
    extends 'Bread::Board::Container';
    
    has '+name' => (default => 'Container');
    
    sub BUILD {
        my $self = shift;
        container $self => as {
            service foo => (
                block => sub {
                    my $s = shift;
                    $s->param('foo_val');
                },
                parameters => {
                    foo_val => { isa => 'Str' },
                },
            );
            service bar => (
                block => sub {
                    my $s = shift;
                    $s->param('foo')->inflate(foo_val => $s->param('foo_val')) . 'BAR';
                },
                dependencies => ['foo'],
                parameters => {
                    foo_val => { isa => 'Str', default => 'FOO' },
                },
            );
        };
    }
    }
    
    my $c = Container->new;
    warn $c->resolve(service => 'bar');
    warn $c->resolve(service => 'bar', parameters => { foo_val => 'baz' });
    

    【讨论】:

      猜你喜欢
      • 2016-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-31
      • 2011-11-12
      • 2016-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多