[seasar-dotnet:2501] Re: DBFlute+Quillについて

kotani.k [E-MAIL ADDRESS DELETED]
2016年 6月 8日 (水) 07:21:36 JST


新谷さん

小谷です。

ご質問の件、taknb2nchさんが書いて下さった方法がDIの使い方として正かと思います。
(QuillにせよS2ContainerにせよSpringなどの他のDIコンテナにせよ)

また、Implementation属性をつける場所は、 「テーブルBhvクラス」になるかと思います。

一応、新谷さんが挙げられたソースコードのように、コンポーネントを全部GetComponentを
使って取得するのなら、「この行を削除できないか?」と考えていらっしゃる部分は削除可能なはずです。
(この場合だとInjectなども必要ありません)
しかし、このやり方ですと GetK010Infoの中にQuillを直接参照するコードを書くことになり、
「DI(Dependency Injection)」を使う意味が限りなくゼロに近くなります。

サンプルなので一つのクラスにまとめているだけとは思いますが、
コンポーネントとなるクラスのコンストラクタにInject呼び出しをするのもおすすめできません。
これもtaknb2nchさんが書かれたように、Mainなどの起動処理(、もしくはWindowsFormなどの
コンテナに登録できない類のクラスのコンストラクタなど)に書いて、Quill(DIコンテナ)と
個々のクラスとは極力分離するべきかと思います。そのためにQuillInjector.Injectがあるので。

以上です。

2016年6月7日 14:05 taknb2nch <taknb2nch @ gmail.com>:

> 新谷さん
>
>
> こんにちは、taknb2nchです。
> 無事にDB接続できたようで良かったです。
>
>
> >どこで、対象のクラス(今回の場合、テーブルBhvクラス)をQuillContainerに登録すればよいのでしょうか?
> 自分で登録はしません。
>
> クラスやインターフェイスにImplementation属性をつけることで
> Quillコンテナでの管理対象になります。
> 必要に応じてQuillがインスタンスの生成、コンテナへの登録を行ってくれます。
>
> 以下をもう一度お読みななるといいと思います。
> http://s2container.net.seasar.org/ja/quill.html#di_quill
>
>
> ご提示のソースコードですと、
> QuillInjector.GetInstance().Inject(this);
> としたタイミングで、
> protected テーブルBhvクラス bhv に
> Quillがインスタンスをセットしてくれます。
>
> ですので、
> GetK010Infoメソッドを以下のようにするだけで動作すると思うのですが・・・。
>
> public テーブルEntityクラス GetK010Info(int intNumber)
> {
>     テーブルCBクラス cb = new テーブルCBクラス();
>     cb.Query().Setキー_Equal(intNumber);
>
>     return bhv.SelectEntity(cb);
> }
>
> ちなみに私ならこう書きます。(動作検証はしてません)
> https://gist.github.com/taknb2nch/3d356cc2d74fc9deae8fde7b2739769b
>
>
> 2016年6月7日 13:55 新谷将亮 <ms630928s @ gmail.com>:
>
> 志水様
>>
>> ご回答いただき、ありがとうございます。
>>
>> 説明不足な点があり、申し訳ございません。
>>
>> テーブルEntityクラス
>> テーブルBhvクラス
>> テーブルCBクラス
>>
>> はDBFluteにより、自動生成されるクラスになります。
>>
>> 書き方もわかりづらかったのですが、
>>
>> 上記のクラスは
>> テーブルA Entityクラス
>> テーブルB Entityクラス
>> テーブルA Bhvクラス
>>>>>>>>
>> のようにテーブルごとに生成されます。
>>
>> dynamicについては、知りませんでした。
>> ありがとうございます。
>>
>> さっそく調べてみました。
>>
>> ========================================
>>
>>     private dynamic Bhv(dynamic bhv, dynamic cb)
>>     {
>>       return bhv.SelectEntity(cb);
>>     }
>>
>> ========================================
>>
>> 上記のようなメソッドを作成し、
>> 呼び出し側からbhvとcbを渡すということだと思うのですが、
>>
>> 実際には、GetK010Infoを画面側から呼び出しています。
>> ⇒呼び出し側は
>>
>>  QuillInjector injector = QuillInjector.GetInstance();
>>  QuillContainer container = injector.Container;
>>
>>  QuillComponent BhvServiceComponent =
>> container.GetComponent(typeof(TestBhvService));
>>  TestBhvService BhvService =
>> (TestBhvService)BhvServiceComponent.GetComponentObject(typeof(TestBhvService));
>>
>>  テーブルEntityクラス entity = BhvService.GetK010Info(2);
>>
>> のように記述しており、移行作業ということで、
>> こちらをできる限り変更したくありません。
>>
>> ※dynamicの解釈が間違っていたらすいません。
>>
>> 現状、悩んでいるのは、
>>
>> QuillInjector.GetInstance().Inject(this); の時点で、
>>
>> protected テーブルABhvクラス bhv;
>> protected テーブルBBhvクラス bhv;
>>
>> のようにメンバ変数に定義していないと、
>> コンテナに登録されなくなってしまいます。
>>
>>
>> また、public テーブルEntityクラス GetK010Info(int intNumber)の
>> メソッドはテーブル単位に作成しており、
>> 引数もselectしたい条件の引数の為、メソッドごとに違っています。
>>
>>
>>
>> 2016年6月7日 11:20 志水正幸 <ie2m-smz @ asahi-net.or.jp>:
>>
>> こんにちは。
>>> 志水です。
>>>
>>> DB接続できるようになってよかったですね。
>>>
>>> 質問の件ですが
>>> 私はC#独学&一人で開発なので
>>> インターフェースとか難しいことはわからないし
>>> 使わないので、やりたいことがイマイチわかってないかもで
>>> アレですが・・・
>>>
>>> >protected テーブルBhvクラス bhv;
>>> の「テーブルBhv」を
>>> 「dynamic」にしとけばテーブル単位に作らなくてもいいと思うんですが。。。
>>> ※前スレでは、たしか新谷さんはFramework3.5からの移行だったと思うので
>>> もしかしたら知らないかもしれませんが
>>> dynamicはFramework4.0から追加されています。
>>> 結構便利な型ですよ。
>>>
>>>
>>> >    public テーブルEntityクラス GetK010Info(int intNumber)
>>> のメソッドはテーブル単位に作るんですか?
>>> それともキーが同じ「テーブルのEntity呼出しの共通メソッドですかね?
>>> あれ?でも、
>>> 「テーブルCBクラス cb = new テーブルCBクラス();」があるからテーブル単位のメソッド?
>>> やっぱり、難しいことはわからない~(笑)
>>> けど、 消すことを考えるより、dynamic使ってゴニョゴニョすればいいようにおもいます。
>>>
>>>
>>> すいません、的外れの場合はスルーしてください(^ ^;)
>>>
>>> 以上
>>>
>>>
>>>
>>> こんにちは、新谷です。
>>>
>>> 以前質問させていただいた、DB接続について、
>>> 正しく動作するようになりました。
>>> ありがとうございます。
>>>
>>> 今回は、DBFlute+Quillの使用について、質問させていただきます。
>>>
>>> 環境
>>> ・.NET Framework4.6.1
>>> ・DBFlute.NET:dbflute-0.8.9.59
>>> ・s2container.net:1.4.1
>>>
>>> 下記のようなソースがあります。
>>>
>>> ===================================================
>>> using Core.DBFlute.CBean;
>>> using Core.DBFlute.ExBhv;
>>> using Core.DBFlute.ExEntity;
>>>
>>>   [Implementation(typeof(TestBhvService))]
>>>   public interface ITestBhvService
>>>   {
>>>     テーブルEntityクラス GetK010Info(int intNumber);
>>>   }
>>>
>>>   public class TestBhvService : TestBase, ITestBhvService
>>>   {
>>> QuillContainer container;
>>>
>>>     /// <summary>
>>>     /// コンストラクタ
>>>     /// </summary>
>>>     public TestBhvService()
>>>     {
>>>       QuillInjector injector = QuillInjector.GetInstance();
>>>       container = injector.Container;
>>>       QuillInjector.GetInstance().Inject(this);
>>>     }
>>>
>>>     protected テーブルBhvクラス bhv; ←この行が削除できないか?
>>>
>>>     /// <summary>
>>>     /// マスタ取得
>>>     /// </summary>
>>>     public テーブルEntityクラス GetK010Info(int intNumber)
>>>     {
>>>       QuillComponent component =
>>> container.GetComponent(typeof(テーブルBhvクラス));
>>>
>>>       テーブルBhvクラス bhv =
>>> (テーブルBhvクラス)component.GetComponentObject(typeof(テーブルBhvクラス));
>>>
>>>       テーブルCBクラス cb = new テーブルCBクラス();
>>>
>>>       cb.Query().Setキー_Equal(intNumber);
>>>
>>>       return bhv.SelectEntity(cb);
>>>     }
>>>   }
>>>
>>> ===================================================
>>>
>>> 上記ソースでは正常に動作します。
>>>
>>> しかし、テーブルのBhvクラスをメンバ変数としてしまうと、
>>> 全てのテーブルのBhvクラスをメンバ変数としてコンテナに登録する必要がでてきてしまいます。
>>>
>>> DBFluteもQuillに対応しているため、
>>> そのようなことはしなくても良いと思っているのですが、
>>> S2ContainerのようにDBFlute.diconも使用しないため、
>>> どこで、対象のクラス(今回の場合、テーブルBhvクラス)をQuillContainerに登録すればよいのでしょうか?
>>> (コンストラクタでコンテナへの登録をし、「GetK010Info」内でコンテナから取り出せると思っております。)
>>>
>>> DBFluteの質問をこのメーリングリストに送るのは適切ではないかもしれませんが、
>>> 可能であれば、教えていただけませんでしょうか。
>>>
>>>
>>> _______________________________________________
>>> seasar-dotnet mailing listseasar-dotnet @ ml.seasar.orghttps://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>
>>>
>>>
>>>
>>> <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=emailclient> ウイルス
>>> フリー。 www.avast.com
>>> <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=emailclient>
>>>
>>> _______________________________________________
>>> seasar-dotnet mailing list
>>> seasar-dotnet @ ml.seasar.org
>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>
>>>
>>
>> _______________________________________________
>> seasar-dotnet mailing list
>> seasar-dotnet @ ml.seasar.org
>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>
>>
>
> _______________________________________________
> seasar-dotnet mailing list
> seasar-dotnet @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>
>
-------------- next part --------------
HTML$B$NE:IU%U%!%$%k$rJ]4I$7$^$7$?(B...
URL: <http://ml.seasar.org/archives/seasar-dotnet/attachments/20160608/9a1ea471/attachment.html>


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