[Seasar-user:3434] Re: 自動バインディングについて

akiyama [E-MAIL ADDRESS DELETED]
2006年 3月 27日 (月) 23:57:09 JST


こんにちは。穐山です。

下記のようなことがやりたかった事です。
それで、自分で考えていたのは ServiceLocator を S2Container そのものに
してしまおうと思っていました。
下記に書いてあるとおりインタフェース/クラスを使うと業務ロジックにS2が依存
しない形になりますね。
下記方法を参考にしてみたいと思います。
ありがとうございます。

>
> 穐山さんの意図されている(と思われる)ことですが、
> ライフサイクルが逆転する箇所はDIではなく ServiceLocator
> を使えば良いのではないでしょうか?
>
> ↓こんな感じ。
> public interface Foo {
>     public void doSomething();
> }
>
> public interface Bar {
>     public void doSomething();
> }
>
> public interface BarLocator {
>     public Bar getBar();
> }
>
> public class FooImpl implements Foo {
>     private BarLocator locator;
>     public void setLocator(BarLocator locator) {
>         this.locator = locator;
>     }
>     public void doSomething() {
>         Bar bar = locator.getBar();
>         System.out.println(this);
>         System.out.println(bar);
>         bar.doSomething();
>     }
> }
>
> public class BarImpl implements Bar {
>     public void doSomething() {
>         System.out.println("doSomething!!");
>     }
> }
>
> public class BarLocatorImpl implements BarLocator {
>     private S2Container container;
>     public void setContainer(S2Container container) {
>         this.container = container;
>     }
>     public Bar getBar() {
>         return (Bar)container.getComponent(Bar.class);
>     }
> }
>
> <?xml version="1.0" encoding="Shift_JIS"?>
> <!DOCTYPE components PUBLIC
>   "-//SEASAR//DTD S2Container//EN"
>   "http://www.seasar.org/dtd/components.dtd">
> <components>
>   <component class="sandbox.FooImpl" instance="singleton"/>
>   <component class="sandbox.BarImpl" instance="prototype"/>
>   <component class="sandbox.BarLocatorImpl" instance="singleton"/>
> </components>
>
> ServiceLocator は S2Container そのものでもいいのですが、
> そうすると、業務ロジックがS2に依存してしまうので、
> 別インタフェース/クラスを作っています。
>



Seasar-user メーリングリストの案内