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

kubo [E-MAIL ADDRESS DELETED]
2010年 3月 24日 (水) 10:01:58 JST


久保(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 メーリングリストの案内