2012-03-29 74 views
0

我发现自己在众多测试中实例化相同的对象,所以我试图用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' } 
       } 
      } 

所以在创建栏的实例服务foo的初始化不同。

回答

0

这是通过#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' });