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

[E-MAIL ADDRESS DELETED] [E-MAIL ADDRESS DELETED]
2010年 3月 26日 (金) 02:02:41 JST


小谷です。

> 「Windows.FormクラスはDesignModeというBool値のプロパティ」
DesignModeはFormやUserControlが継承している
System.ComponentModel.Componentがもっているプロパティのようです。
QuillControlもこのプロパティを見ていて、
これがtrueだった場合はデザイナ上で動いていると見なしてインジェクション等の処 
理を行わないようにしています。

ただ、このプロパティを使うのは、もしかすると問題があるかもしれません。
http://support.microsoft.com/default.aspx?scid=kb;en-us;839202

回避策が議論されたりもしているのでこれらを参考にいい方法があれば試してみたい 
と思います。
http://social.msdn.microsoft.com/Forums/ja-JP/csharpexpressja/thread/d946a597-0ba4-4880-b99b-13c728e2f39f


kubo <[E-MAIL ADDRESS DELETED]>:
> 久保(jflute)です。



> ひとまず、回避策が見つかったということでなによりです。



> 主に小谷さん

> とある方からからのフィードバックで、

> 「Windows.FormクラスはDesignModeというBool値のプロパティ」

> を持っているようで、もしかしたらVS上のデザイナで

> 動作しているのかどうか、を判定できるかもしれないと。

> 具体的にどう取り込めるかわかりませんが、ヒントになればと。



> 2010/3/24 ikutirin [E-MAIL ADDRESS DELETED]>:

> > 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 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

-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: <http://ml.seasar.org/archives/seasar-dotnet/attachments/20100325/968d1636/attachment.html>


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