[seasar-dotnet:1632] Re: 基底FormクラスにDI対象フィールド+AOP対象でエラー

ikutirin [E-MAIL ADDRESS DELETED]
2010年 3月 24日 (水) 14:16:11 JST


ikutirinです。
補足です。

XXXServiceInvokerを間に挟む場合、
XXXServiceInvokerのコンストラクタで

QuillInjector.GetInstance().Inject(this);

が必要です。



ikutirin <[E-MAIL ADDRESS DELETED]> wrote:
> 
>  Subject: Re: [seasar-dotnet:1629] Re:基底FormクラスにDI対象フィールド+AOP対象でエラー
>     Date: Wed, 24 Mar 2010 14:13:29 +0900
>     From: ikutirin <[E-MAIL ADDRESS DELETED]>
>       To: [E-MAIL ADDRESS DELETED]
> 
> ikutirinです。
> アドバイスありがとうございます。
> いろいろと試した結果、解決したっぽいです。
> 本文最後に方法を書いています。
> 
> A案、早速試してみました。
> 結果、現象は同じでした。
> 
> B案、C案も最悪の事態になれば試そうと思いましたが、
> 解決したっぽいので、試していません。
> ここまでするならクラス構成も再度考えた方がいいかもしれませんけどね。
> また、できれば抽象Formは避けたいのですが、
> きっと、デザイン後であればいいのでしょうね。
> #デザイナで修正する場合はabstractを外して。。。
> 
> 
> で、私なりに考えた結果、
> Seasar.Quill.QuillContainerからインスタンスを取得しようと思いました。
> そこで、AAAForm(S2Form→AAAForm→BBBFormという構成)のとあるメソッド内で、
> 下記のようにしました。
> 
> Seasar.Quill.QuillContainer container = new Seasar.Quill.QuillContainer();
> 
> Seasar.Quill.QuillComponent component = 
>     container.GetComponent(typeof(XXXServiceInvoker));
> 
> XXXServiceInvoker serviceInvoker = 
>     (XXXServiceInvoker)component.GetComponentObject(
>         typeof(XXXServiceInvoker)
>     );
> 
> これで、欲しいインスタンスが取得できました。
> XXXServiceInvokerクラスを間に挟んでいるのは、
> singletonにならないかも?と思ったから。。。
> 直接IXXXServiceの実装クラスをインスタンス化しても問題なさそうでしたが、
> #当然インターフェース型で取得します。
> 
> ただ、他と違うアプローチなので、このままでいこうと思います。
> 
> クラス構成や関連がおかしいわけではないと思うので、
> 根本的な対応を期待しています。
> #時間があれば私もソースを追ってみます。
> 
> 以上です。
> 
> kubo <[E-MAIL ADDRESS DELETED]> wrote:
> 
> > 久保(jflute)です。
> > 
> > 回避策を模索するアドバイスしかできませんが...
> > もし、状況が局所的であれば、
> > 
> > A. IServiceXxxの呼び出しを委譲するコンポーネント
> > ServiceInvokerみたいなクラスを一つ作って、
> > これ自体はAOPを掛けずに、中でIServiceXxxを呼び出す
> > 形で回避できないでしょうか?
> > (同じ現象が発生するかどうか)
> > ネストしたフィールドのコンポーネントにAOPが
> > 掛かってたらダメ、であれば結局ダメな案です。
> > 
> > B. Abstractクラスの導入
> > "BForm  : AForm"
> > ではなく、
> > "AForm : AbstractXxxForm"
> > "BForm : AbstractXxxForm"
> > という構造にして、AbstractXxxFormにIServiceXxxを
> > 定義するやり方で回避できないしょうか?
> > (同じ現象が発生するかどうか)
> > Abstractだろうが何だろうがスーパークラスのフィールド
> > のコンポーネントにAOPが掛かってたらダメ、
> > であれば結局ダメな案です。
> > 
> > C. "B" 方式でロジックだけを再利用
> > "B" の構成で、フィールドの定義はサブクラスで行い、
> > テンプレートメソッドパターンなどを用いて、
> > ロジックだけは再利用するやり方でどうでしょう?
> > 例えば、IServiceXxxのインスタンスの取得をabstractメソッド
> > にしてサブクラスから供給するようにするなど。
> > 
> > 2010/3/24 ikutirin <[E-MAIL ADDRESS DELETED]>:
> > > ikutirinです。
> > > ご返信ありがとうございます。
> > >
> > > まず、
> > >> スーパークラスのFormにAspect属性付きの
> > >> コンポーネントのフィールド定義すると、
> > >> 実行は問題ないけど、VisualStudioのデザイナで開けない
> > >>
> > >> まとめるとこんな感じでしょうか。
> > > その通りです。
> > >> 「QuillControl」をお使いでしょうか?
> > > QuillControlをスーパークラスのFormに貼り付けています。
> > >
> > >> A. IXXXXServiceをインターフェースじゃなくてクラスで
> > >> B. Aspect属性じゃなくてTransaction属性で
> > >> C. "A" と "B" 両方で
> > >>
> > >> で、同じ現象が発生するかどうか試して頂けますでしょうか?
> > >> (もし、全てで発生するなら、要はAOP掛かったコンポーネント
> > >> がダメってことになりますね)
> > > AもBもCも同じ現象が発生しました。
> > >
> > >> もしお使いでしたらそれを外し、代わりにmainメソッドなど、
> > >> Formとは関係ない場所で自前でQuillInjector.Injectを呼び出すようにしてみていた
> > >> だけないでしょうか。
> > > QuillInjectorを使用するとうまくいくかもしれませんが、
> > > しかし、全てのFormにいわゆるおまじないを記述しなければならず、
> > > できれば避けたいです。
> > > どうしても解決しない場合に、試させていただきます。
> > >
> > >> また、念のため、VisualStudioのバージョン(.NET自体のバージョンも)
> > >> やエディションをお願いします。
> > > VisualStudio2008 Professional SP1
> > > .NET framework 3.5
> > > で開発を進めております。
> > >
> > > なんとか解決できないでしょうか。。。
> > > よろしくお願いします。
> > >
> > >
> > > [E-MAIL ADDRESS DELETED] wrote:
> > >
> > >> ikutirinさん
> > >>
> > >> 小谷です。
> > >>
> > >> 「QuillControl」をお使いでしょうか?
> > >> もしお使いでしたらそれを外し、代わりにmainメソッドなど、
> > >> Formとは関係ない場所で自前でQuillInjector.Injectを呼び出すようにしてみていた
> > >> だけないでしょうか。
> > >> (根本的な解決にはならないと思いますが・・・)
> > >> ※参考
> > >> http://s2container.net.seasar.org/ja/quill.html#di_quill
> > >>
> > >> デザイナ上では呼ばれないはずの
> > >> QuillControl#EndInit内でのInject呼び出しが行われているようなので。
> > >>
> > >> ikutirin <[E-MAIL ADDRESS DELETED]>:
> > >> > ikutirinです。
> > >>
> > >> > 解決へのヒント、回答をよろしくお願いします。
> > >>
> > >>
> > >>
> > >> > Seasar.Quil.dll:1.3.17.0、
> > >>
> > >> > DBFlute:0.8.9.12
> > >>
> > >> > で開発しています。
> > >>
> > >>
> > >>
> > >>
> > >>
> > >> > S2Formを継承したFormを作成しました。(AAAFormとします)
> > >>
> > >> > AAAFormを継承してFormを作成しました。(BBBFormとします)
> > >>
> > >>
> > >>
> > >> > AAAForm内で、
> > >>
> > >> > protected IXXXXService xxxService;
> > >>
> > >> > とDI対象のフィールドを用意すると、
> > >>
> > >> > BBBFormをVisualStudioのデザイナで表示できなくなります。
> > >>
> > >> > 以下エラーがでます。
> > >>
> > >> > ---
> > >>
> > >> > メソッドが見つかりません:
> > >>
> > >> > 'Void Seasar.Framework.Aop.Proxy.DynamicAopProxy..ctor(System.Type,
> > >>
> > >> > Seasar.Framework.Aop.IAspect[], System.Collections.Hashtable)'
> > >>
> > >> > ---
> > >>
> > >>
> > >>
> > >> > IXXXXServiceにはAspect属性を設定しており、その属性を外すと
> > >>
> > >> > エラーがでず、正常にデザイナで開くことができます。
> > >>
> > >>
> > >>
> > >> > ためしに、
> > >>
> > >> > BBBForm内に、
> > >>
> > >> > protected IXXXXService xxxService;
> > >>
> > >> > を書いてみましたが、エラーは発生しません。(当然ですね。。。)
> > >>
> > >> > #AAAFormは常に、問題なくデザイナで開くことができます。
> > >>
> > >>
> > >>
> > >> > S2Form→AAAForm→BBBFormという構成で、
> > >>
> > >> > AAAForm内にAspect属性を指定したインターフェースのフィールドを作成したいの
> > >> > ですが、
> > >>
> > >> > どのようにすればよいでしょうか。
> > >>
> > >> > #実行は出来るのですが、VisualStudioのデザイナで開けなくなります。
> > >>
> > >>
> > >>
> > >> > よろしくお願いします。
> > >>
> > >> > _______________________________________________
> > >>
> > >> > seasar-dotnet mailing list
> > >>
> > >> > [E-MAIL ADDRESS DELETED]
> > >>
> > >> > https://ml.seasar.org/mailman/listinfo/seasar-dotnet
> > >>
> > >
> > > _______________________________________________
> > > seasar-dotnet mailing list
> > > [E-MAIL ADDRESS DELETED]
> > > https://ml.seasar.org/mailman/listinfo/seasar-dotnet
> > >
> > _______________________________________________
> > seasar-dotnet mailing list
> > [E-MAIL ADDRESS DELETED]
> > https://ml.seasar.org/mailman/listinfo/seasar-dotnet



seasar-dotnet メーリングリストの案内