ServiceLocatorやDIコンテナみたいな

簡易ETLツールだとか、バッチ処理みたいなプログラムを組む事も多いんですが。
こういうのを作るときには、ServiceLocatorというかAbstract FactoryとDependency Injection機能を持ったコンテナが欲しくなりますね(・∀・)


で、これもORマッパーとかと同じく、使い慣れた物があればそれを使うんですが。
設定ファイルを使わず、構築に必要な情報はAttributeで指定するような軽量級のものが欲しくって。


今日はそんな単純なものを作っていたり。
AOPだとか本格的な機能が無くっても、インスタンスの生成と依存性の注入を外部に出すだけでも嬉しいですし。
まあ、AOPしたかったらCastle.DynamicProxyでも使うべ、っということで(・∀・)


ちなみに昔話になりますが、自分がDIコンテナ(そのころはIoCって言ってましたっけ)の嬉しさを最初に知ったのは、WebWork2かなんかの例を見てだったと思います。
#WEB+DBプレスだったかな?


よくあるWebショップで、商品をショッピングカートに追加する際のActionの例で。
擬似コードですが、たしかこんなカンジのものだったと思います。

// DI使用前
public class AddAction extends Action
{
    public String execute()
    {
        Map session = ActionContext.getContext().getSession();
        ShopingCart cart = (ShopingCart)session.get("Cart");
    
        if (cart == null)
        {
            cart = new ShopingCart();
            session.put("Cart", cart);
        }
    
        cart.add(new Item());
    
        return SUCCESS;
    }
}

DIコンテナを使うと、↑が↓みたいに書き換えられるという。

// DI使用後
public class AddAction extends Action
{
    private ShopingCart cart;
    
    void setShopingCart(ShopingCart cart)
    {
        this.cart = cart;
    }
    
    public String execute()
    {
        this.cart.add(new Item());
    
        return SUCCESS;
    }
}

ちなみにWebWork2はInterface Injectionで、これはSetter Injectionじゃんとかいう話もありますが、あくまで擬似コードだということで(´Д`)


正直、最初にIoCだとかGirlとBoyがKiss my ass!(違)だとかを聞いたときにはよく分からなかったんですが、この例を見て嬉しさが分かったのでした(´ω`)