Hatena::Groupcatalyst

dann@catalyst このページをアンテナに追加 RSSフィード

2008-04-02

DIコンテナ

00:09 |  DIコンテナ - dann@catalyst を含むブックマーク はてなブックマーク -  DIコンテナ - dann@catalyst  DIコンテナ - dann@catalyst のブックマークコメント

DIコンテナの一つの役割は、オブジェクトの依存関係をWiringして、上記のような依存関係を解決することです。以下にBread::Boardを利用したDIの例を説明します。

package MyApplication;
use Moose;
has 'logger' => (is =>'ro', required => 1);

sub run {
    my $self = shift;
    $self->logger->log();
}

1;
package FileLogger;
use Moose;
has 'log_file_name' => (is=> 'ro', required => 1);

sub log {
    my $self = shift;
    print "log\n";
}

1;

実行するコードは、以下のようになります。下記の例は、Bread::BoardというPerlのDIコンテナを利用したものです。

my $c = container 'MyApp' => as {

    service 'log_file_name' => "logfile.log";

    service 'logger' => (
        class        => 'FileLogger',
        lifecycle    => 'Singleton',
        dependencies => [ depends_on('log_file_name'), ]
    );

    service 'application' => (
        class        => 'MyApplication',
        dependencies => {
            logger => depends_on('logger'),
        }
    );

};

$c->fetch('application')->get->run;

applicationサービスを取得すると、MyApplicationのオブジェクトはFileLoggerオブジェクトが設定された状態(依存関係がwiringされた状態)で取得されるため、MyApplicationのrunメソッドを実行すると、Loggerのlogメソッドが呼ばれます。

このようにDIコンテナが外から依存関係を注入してくれるため、各種サービスは依存関係のあるクラスの実装の詳細を知ることがないため、互いに疎に結合されます。それによって、各サービスは単体でテストができるようになります。

MccadeMccade2011/08/02 12:38This forum needed sakhing up and you've just done that. Great post!

kmeyilypzkmeyilypz2011/08/03 20:4915ggJ4 , [url=http://qeznvwezdxfs.com/]qeznvwezdxfs[/url], [link=http://nuwhqfxgeivl.com/]nuwhqfxgeivl[/link], http://srnfyjntrpcw.com/

hvqabaqxdhvqabaqxd2011/08/05 22:13fSEfDn , [url=http://hitejlqemnsf.com/]hitejlqemnsf[/url], [link=http://ldrpnarvjijm.com/]ldrpnarvjijm[/link], http://mvfzvlgrqjjn.com/