3

Mooseとを使用して、型制約をBread::Board持つ属性を持つオブジェクトを作成し、そのパラメーターを次のような方法で注入することは可能ですか?ArrayRef[SomeObject]

  • ArrayRef制約が維持され、
  • その ArrayRef のメンバーである各オブジェクトは、そのすべての依存関係が によって満たされていますBread::Board
  • その ArrayRef のメンバーである各オブジェクトは、Bread::Board?によって作成されたオブジェクトです。

私が自分自身を明確に説明していることを確認するために、信じられないほど単純な例を考えてみましょう。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,
);

の 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');

何か案は?はい、私Vehicleの車にはおそらく車輪がなく、一輪のセダンを作ろうとしていることは承知していますが、あなたは私の主張を理解していると思います. :-) これは、非常に些細な例であることのみを意図しています。

4

1 に答える 1

4

carTires サービスが Wheels の ArrayRef を返すようにすることができます。

container 'wheels' => as {
    service 'carTires' => (
        block => sub {
            return [ map {Wheel->new} 1..4 ];
        },
    )
};

ArrayRef[Wheel] としてすでに定義されているため、Vehicle コンストラクターが型制約に関して残りの処理を行います。

したがって、代わりにこれを行うと死ぬでしょう:

container 'wheels' => as {
    service 'carTires' => (
        block => sub {
            return [ map {Window->new} 1..4 ];
        },
    )
};
于 2011-06-14T09:08:11.400 に答える