[CONTAINERNET-79] Quill単独でトランザクション処理・S2Dao.NETの利用を行えるようにする Created: 2007-12-10 Updated: 2008-07-29 Resolved: 2008-07-29 |
|
| Status: | Resolved |
| Project: | S2Container.NET |
| Component/s: | Quill |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Type: | New Feature | Priority: | Major |
| Reporter: | sugimotokazuya | Assignee: | koyak |
| Resolution: | Fixed | Votes: | 0 |
| Labels: | None | ||
| Attachments: |
|
| Description |
|
QuillのシンプルなDIとAOPでは実現が難しいので、専用の属性を作ろうかと考えています。 |
| Comments |
| Comment by koyak [ 2008-07-29 ] |
|
ドキュメントを整理し終わってからResolveとしようかと考えていましたが、 |
| Comment by koyak [ 2008-04-06 ] |
|
ここでの変更内容(データソース、アセンブリ、S2Dao、トランザクションの設定)について QuillTestCaseについてはまだ書いていないのですが・・・ |
| Comment by koyak [ 2008-03-11 ] |
|
> 2. QuillTestCaseを継承し忘れるとNullReferenceExceptionなので明示的な例外が欲しい また、接続文字列の取得時に、外部からのファイル読み込みなどの 以下のように指定するとDataSourceBuilderクラスの中でインスタンスを生成(この場合はDummyConnectionString)し、 従来のように文字列で直接指定したい場合は「"」で囲みます。 |
| Comment by jflute [ 2008-03-07 ] |
|
> 例: のclassをSeasar.Extension.Tx.Impl.TxDataSourceに変えたらOKでした。 > 2. QuillTestCaseを継承し忘れるとNullReferenceExceptionなので明示的な例外が欲しい さあ、あともうちょい!頑張って! |
| Comment by jflute [ 2008-03-07 ] |
|
3番はテストで使ってるMySQLの環境かとも思ったけど、 |
| Comment by jflute [ 2008-03-07 ] |
|
1. QuillTestCaseTestがコミットされてない!? |
| Comment by koyak [ 2008-03-07 ] |
|
コミットしました。 QuillContainerでdiconなしテストを実行したい場合は テストを実行すると Seasar.Test.Quill.Unit.QuillTestCaseTestにて動作確認しています。 |
| Comment by jflute [ 2008-03-06 ] |
|
おお、コミットしたら早速DBFluteNBasicExampleで試しますよ。 |
| Comment by koyak [ 2008-03-06 ] |
|
>杉本さん >「S2TestCaseRunner」を参考に「QuillTestCaseRunner」を作るか、 QuillTestCaseRunnerを作る方向で。 [Test, Quill(Tx.Rollback)]で中身空っぽのテストが動くことは |
| Comment by sugimotokazuya [ 2008-03-05 ] |
|
特に問題ないと思います。 |
| Comment by jflute [ 2008-03-02 ] |
|
残り課題: > B. リリース後でもよい: は、次回でも良いでしょう。別課題にしちゃって下さい。 固定的な複数DB対応は、既に別課題になっていますが、 なので、あとは「テストケースでのトランザクション」と「ドキュメント」ですね。 テストケースは、 |
| Comment by jflute [ 2008-03-02 ] |
|
「Y」に関して動作確認取れました。 あとは、単体テストでのトランザクションをどうするかかな!? |
| Comment by jflute [ 2008-03-02 ] |
|
> MySQL.Dataを追加しても駄目ですか? もともと追加されています。それでダメでした。 > 自分の環境ではそれでMySqlConnectionクラスなどのインスタンスを まあ、他の人の環境でOKならOKではあるので優先度下げますか。 Yに関しては動作確認取れたらコミットしてOKです。 |
| Comment by koyak [ 2008-03-02 ] |
|
<X>テストの初期化時に以下を実行しないと例外になってしまった。 >また、問題の本質とは別に、ForName()の戻り値nullは明示的な例外にしたほうが良い。 <Y> quillセクションに定義がなければ どちらにも定義がなければdiconの設定を使います。 注・まだコミットはしていません。 |
| Comment by jflute [ 2008-02-27 ] |
|
テストケースのトランザクションは、Seasar.UnitのS2TestCaseRunnerをそのまま間借りするか、 |
| Comment by jflute [ 2008-02-26 ] |
|
エンコーディングがバラバラになってるかな!? |
| Comment by jflute [ 2008-02-26 ] |
|
<X> System.Reflection.Assembly.Load("MySQL.Data, version=1.0.10.1, Culture=neutral, PublicKeyToken=c58..."); 例外箇所は、Seasear.Extension.ADO.DataProviderDataSource#GetConnection()で、 また、問題の本質とは別に、ForName()の戻り値nullは明示的な例外にしたほうが良い。 <Y> 上記2点以外は、今のところちゃんと動いています。 > ThreadLocalではなく、通常のインスタンス変数とし、 この話は別途検討した方が良いかもね |
| Comment by koyak [ 2008-02-26 ] |
|
↑Aについては対応しました。 DataSourceはquillセクションの中のdataSourcesタグ内で name属性→データソースを特定する一意の名前 例: connectionStringタグも引き続き使用できるようにしています。 |
| Comment by koyak [ 2008-02-22 ] |
|
ありがとうございます。 |
| Comment by jflute [ 2008-02-22 ] |
|
課題をまとめます。 A. 対応しないとリリースしちゃいけない: A-1. 全てのDataProviderを指定可能なConnection指定 B. リリース後でもよい: B-1. DynamicProxyがGenericのメソッドをサポートしていない |
| Comment by jflute [ 2008-02-22 ] |
|
2点: <1> というコンソールログが出る <2> Message: [ESSR0071]SQLException occured, because Seasar.Framework.Exceptions.EmptyRuntimeException: ※2番は致命的 |
| Comment by jflute [ 2008-02-22 ] |
|
DynamicProxyがGenericのメソッドをサポートしていない!? 現在、DaoでGenericありのメソッドを作ると以下のような例外になります。 Message: アセンブリ 'DynamicAssemblyProxyGen, Version=0.0.0.0, Culture=neutral, PublicKeyToken=f362209d9bee91d8' からの型 'ProxyInterfaceSystemSystemObject_DfExample_DBFlute_AllCommon_CBean_OutsideSqlOutsideSqlDao_System_Runtime_SerializationISerializable' にあるメソッド 'SelectList' に実装が含まれていません。 |
| Comment by jflute [ 2008-02-22 ] |
|
App.configでのConnectionの指定とado.diconの指定が両方無い場合に、 |
| Comment by jflute [ 2008-02-22 ] |
|
> DB接続文字列とデータプロバイダの部分ですが 一つは、ドキュメントの記述例の補足として「SQLServerの例」と もう一つは、この方式をサポートしているDataProviderが少ないのではないかと懸念します。 |
| Comment by koyak [ 2008-02-22 ] |
|
コミットしました。 S2DaoAttributeとTransactionAttributeで行っているテストは |
| Comment by jflute [ 2008-02-20 ] |
|
ある程度のテストができたら、DBFluteの方でも実装始めたいと思います。 |
| Comment by koyak [ 2008-02-20 ] |
|
>App.config標準機能のDB接続文字列を指定する方法ではだめでしょうか? ・上記機能を使ってデータソース設定を実装しました。 ・Transaction属性に渡す型はITransactionSetting実装クラスにしました。 どちらも あとはテスト・・・? |
| Comment by jflute [ 2008-02-19 ] |
|
> SQLに関するあれこれを設定することと 同意。 > Transaction属性の引数に渡すものを少し変えて、 同じようなやり方の方がユーザにとってわかりやすいと思います。 余談ですが、トランザクション分離レベルに関するフレームワークへの |
| Comment by koyak [ 2008-02-19 ] |
|
もう一つ確認させていただきたいことがありました。 トランザクション分離レベルの指定はどうしましょう。。。 Transaction属性の引数に渡すものを少し変えて、 public interface ITransactionSetting AbstractInterceptor TransactionInterceptor { get; } // これもいらないかも? void Setup(IDataSource dataSource); |
| Comment by koyak [ 2008-02-18 ] |
|
ご意見ありがとうございます。>お二方 >App.config標準機能のDB接続文字列を指定する方法ではだめでしょうか? >> IDaoSetting これは自分でもコード書いてて「これだと自動生成しづらいか・・・?」と とすると、IDaoSettingは public interface IDaoSetting ICommandFactory CommandFactory { get; } IAnnotationReaderFactory AnnotationReaderFactory { get; }IDaoMetaDataFactory DaoMetaDataFactory { get; } AbstractInterceptor DaoInterceptor { get; }void Setup(IDataSource dataSource); こんな感じでしょうか。 この辺は下手に自動設定するよりも このIDaoSettingをS2Dao属性に指定できるようにする、と。 内部でチェックする順序としては S2Dao属性が指定されているか? こんな感じでやってみます。 |
| Comment by jflute [ 2008-02-18 ] |
|
小谷さん、休日つぶしてお疲れです。 > IDaoSetting 以前の仕様のようにS2Dao属性の引数にIDaoSettingsを指定して、 |
| Comment by sugimotokazuya [ 2008-02-18 ] |
|
お疲れ様です。 DB接続文字列とデータプロバイダの部分ですが |
| Comment by koyak [ 2008-02-18 ] |
|
もう一つ。プロバイダの指定については |
| Comment by koyak [ 2008-02-18 ] |
|
・app.configからデータソースの定義をできるようにできました。 以下のような仕様で実装しています。 ○[S2Dao]属性(クラス/メソッド)を付けるとDaoInerceptorがかかる。 ↓app.configの設定例 上記仕様で特に問題がなければテストコードも書いていきたいと思います。 |
| Comment by jflute [ 2008-02-15 ] |
|
ありがとうございます。 > 1.App.config上にあるデータソースの定義(未実装) |
| Comment by koyak [ 2008-02-15 ] |
|
違うファイルをあげてしまったので再アップ |
| Comment by koyak [ 2008-02-15 ] |
|
下記のような仕様で実装してみたのですが ○トランザクション Type型で使えるのは「AbstractQuillTransactionInterceptor」の ○複数データソース対応 Quillに を追加(名前長・・・) 基本的な使い方はJava版のSelectableDataSourceProxyと同じ SelectableDataSourceProxyWithDictionaryの方は Quill上のデータソースを参照するクラスは基本的にこの QuillContainerがnewされるとSelectableDataSourceProxyWithDictionaryの 登録処理時、以下の優先度で 1.App.config上にあるデータソースの定義(未実装) Quill.Example上ではトランザクションの開始→コミットの流れで |
| Comment by koyak [ 2008-02-08 ] |
|
添付ファイル→DataSourceManager.csです。 |
| Comment by koyak [ 2008-02-08 ] |
|
複数データソース対応の案として。 データソースを管理するクラス(添付ファイル:DataSourceManager参照)を用意し、 使用するデータソースはApp.settingに記述 データソース選択ロジック(添付ファイル:IDataSourceSelector参照)は 余裕があれば以下のような基本的なものについてはあらかじめ用意しておく |
| Comment by sugimotokazuya [ 2008-02-05 ] |
|
> これは、Quillの方向性の根本に関わるので明確にしておきたいのです。 小谷さんのデータソースの指定方法の件ですが、Logicにトランザクションをかける場合は、どんな感じをそう指定していますか? |
| Comment by jflute [ 2008-02-05 ] |
|
> これは、Quillの方向性の根本に関わるので明確にしておきたいのです。 |
| Comment by Anonymous [ 2008-02-05 ] |
|
> Transaction属性を使う場合はS2ContainerのTransactionには対応しなくていいのではないか。 これは、Quillの方向性の根本に関わるので明確にしておきたいのです。 上記の対応でよいというのは、 例えば、S2DaoをQuill対応したとして、いわば2つのS2Dao いや、これでもいいとは思うのですが、単に明確にしておきたいって話です。 > データソースは初めから複数データソースに対応しておけば後が楽(難しい部分なので) これは単純にパワーの問題なので、小谷さんいけるかな!? |
| Comment by koyak [ 2008-02-05 ] |
|
複数データソースの対応について データソースのConnectionStringなどの設定は基本的にApp.configに記述 ○静的にデータソースを割り当てる ○動的にデータソースを割り当てる (HogeDaoSettingはHogeDaoSettingでその他のカスタマイズ用に用意しておく) |
| Comment by koyak [ 2008-02-05 ] |
|
Skypeでお話した内容のメモ ・データソースは初めから複数データソースに対応しておけば |
| Comment by koyak [ 2008-02-03 ] |
|
小谷です。 まずはトランザクションの指定をできるように、ということで 1.TransactionAttribute([Transaction])でトランザクションを 2.1が指定された場合、 という形で実装してみました。 確認はQuill.Exampleの方で行っています。 コードの方もできればご覧になっていただきたいのですが、 蛇足: |
| Comment by jflute [ 2008-01-30 ] |
|
Anonymousになってますが、杉本さんですよね?(^^ シンプルと柔軟性の狭間での調整になるかと思います。 Settings自体はしっかりインターフェースになっているので、 これならば、内部構造も複雑にはならないし、 その「デフォルトSettings」が設定ファイルなのか、 |
| Comment by Anonymous [ 2008-01-30 ] |
|
jfluteさん もし他に解決策や良い案があれば、私の案の原型が残ってなくても全然大丈夫ですので、 jfluteさんの方が、現場の声を知っていると思いますので。 |
| Comment by jflute [ 2008-01-29 ] |
|
杉本さんコメントありがとうございます。 まあ、HogeDaoSettingsが全てのDaoアノテーションに指定ってのは、 DBFluteは自動生成なので全然問題ないですが、 横断修正自体はそんなに大変じゃないとは思うので致命的ではないですが、 > 小谷さんへ 「Step1. S2ContainerとS2Daoはそのままで本機能を実現する。」 なぜかというと、今のトランザクションを発行できない状態だと |
| Comment by sugimotokazuya [ 2008-01-13 ] |
|
遅くなってすいません。とりあえず、どういう考えだったかを書いておきます。 データプロバイダやS2Dao.NETのコンポーネントのカスタマイズはAbstractDaoSettingsを継承して1つクラスを用意します。 たとえば次のように。DB接続の設定が1つの場合はデータプロバイダの設定は不要。さらに標準のS2Dao.NETの構成の場合は、このようなクラスは必要なし。 public class HogeDaoSettings : AbstractDaoSettings // このようなカスタマイズ用のメソッドがいろいろ用意されている } これをTransaction属性やS2Dao属性に設定します。DB設定が1つだけの場合は引数なし。 // 複数のデータソースが存在する場合 // 設定が1つだけの場合はこれだけ。 // 複数のデータソースが存在する場合 // 設定が1つだけの場合はこれだけ。 HogeDaoSettingsとかを作るのは面倒な感じですが、1つのデータソースにつき1つだけ用意すればいいので、ドキュメントをしっかり用意すれば、XMLの設定ファイルを書くより、受け入れられるんじゃないかと考えています。 |
| Comment by jflute [ 2008-01-13 ] |
|
> ・(U)ユーザ様にpartial interface IDataSourceというように Assemblyをまたがってpartialでできたっけ??? 確かにそれができれば、ユーザ様の指定を確立することができますね。 |
| Comment by koyak [ 2008-01-13 ] |
|
すいません。上で自分が書いている内容って |
| Comment by koyak [ 2008-01-13 ] |
|
小谷です。 パターン1に1票です。 dao/Ado.diconで設定していたクラスについては 以下、 まず (Q)コンストラクタorメソッドインジェクションを使って ○使用する実装クラスの候補が複数あるinterfaceの場合(IDataSourceなど) (Q)DataSourceの場合はあらかじめ各DBMS用の設定をしてある (U)以下のようなコードをどこかに書いてもらう (Q)ConnectionStringなどの文字列設定項目は というようなinterfaceを新たにQuill側で用意し、 といった形で実装してもらう(delegateを使うのもアリかも)。 あとは ----------------------------------------------------------- 普通にS2Daoを使うのよりも手間がかかってしまいそうな |
| Comment by jflute [ 2008-01-11 ] |
|
ひとまず、既出の情報で機能仕様をまとめてみました。 要確認事項があります。
[機能要件] [機能概要] [関連機能要件] これらは本機能を実現するための最終的な実現方法の要素となる。 [関連機能概要] 要確認 要確認 <B> 要確認 [実装考察] パターン1: Step1. S2ContainerとS2Daoはそのままで本機能を実現する。 <Step1> <Step2> <Step3> パターン2: Step1. パターン1におけるStep1,3を実現する。 |
| Comment by jflute [ 2008-01-10 ] |
|
なるほど、了解です。 杉本さんには概念設計と内部設計をやってもらって |
| Comment by sugimotokazuya [ 2008-01-10 ] |
|
依存しなくはないのですが、あまり分けても工数は減らない感じです。 |
| Comment by jflute [ 2008-01-09 ] |
|
DaoのQuill化とQuillでのトランザクション制御はどうしても依存しますか? もし、そうでないなら、 既にQuillを使ってやろうとしているプロジェクトもあり、
|
| Comment by sugimotokazuya [ 2007-12-17 ] |
|
> これも、もうAdo.diconを利用しないイメージですかね。 そうです。Quillで完全にdiconファイルを無くすための機能です。 |
| Comment by jflute [ 2007-12-16 ] |
|
> いえ、Aspect属性でS2ContainerのDaoInterceptorを指定していた所をS2Dao属性にします。 ああ、なるほど了解です。 > S2DaoをQuillで属性を用意して特別扱いしてしまいます。 まあ、仕方ないですね。 > 引数なしの場合はアプリケーション構成ファイルのDB設定の1つ目が自動で使われます。 これも、もうAdo.diconを利用しないイメージですかね。 |
| Comment by sugimotokazuya [ 2007-12-16 ] |
|
> これって、S2Daoを使ったDBアクセスの場合は、 S2DaoをQuillで属性を用意して特別扱いしてしまいます。 |
| Comment by jflute [ 2007-12-16 ] |
|
ありがとうございます。 > S2Daoを使いたい場合にはS2Dao属性をつけます。 > 引数にはIDaoContextの実装クラスのTypeを渡せます。(IDaoSettingsの方が良いかな?) |
| Comment by sugimotokazuya [ 2007-12-16 ] |
|
トランザクションを行うにはTransaction属性をつけます。 引数なしの場合はアプリケーション構成ファイルのDB設定の1つ目が自動で使われます。 引数にはIDaoContextの実装クラスのTypeを渡せます。(IDaoSettingsの方が良いかな?) 引数で指定されたDaoContextは始めて使われるときにインスタンス化されQuillに登録されます。 Diconのような設定ファイルを使わない方針なので、こんな感じしかないかなと思っています。 |
| Comment by jflute [ 2007-12-14 ] |
|
昨日、口頭で伺った「やり方を悩んでる」っていうの、 |
| Comment by jflute [ 2007-12-10 ] |
|
おお、これは何気に無茶苦茶欲しい機能ですね。 |