Blazor でDBFluteは使えるのか??

166 views
Skip to first unread message

志水正幸

unread,
May 25, 2020, 7:33:04 AM5/25/20
to DBFluteユーザの集い
志水です。
お世話になっております。

いままでWebFormを使い続けてきたのですが
最近では.NET Core3.2もリリースされ
そろそろ、新しい技術へ移行した方がいいのか??
と思ってきたところに
Blazor webassemblyがリリースされて
Javascript嫌いでMVCよくわからんと避けてきた私でも
これならと思ったところで、ふと思ったのですが
Blazor webassemblyのBlazorサーバのAPIで
DBFlute.NET環境の実装はできるのか?
できそうな気もするがQuilがうごくかな?
とモヤモヤしてるのですが
実際のところ、DBFlute.NETはどこまでイケるのでしょうか?
教えてください。

以上、宜しくお願い致します。


kubo

unread,
May 25, 2020, 7:37:31 AM5/25/20
to DBFluteユーザの集い
jfluteです、志水さん、こんばんは

いま初めて Blazor webassembly という言葉を聞いたところではありますが...

まずは、「DBFluteが」って言うよりかは、ADO.NETが動作するかどうか?
ってところがポイントだと思います。こちらのページ参考になるかもしれません。

// ASP.NET Core Blazor C# で CData ADO.NET Provider kintone を使う
https://kageura.hatenadiary.jp/entry/blazorkintoneado

あとは、たしかに Quill (裏側S2Container.NET) が動くかどうか?
というのは不安になるところですね。それなりに内部の仕組みが複雑なところですから。

志水正幸

unread,
May 25, 2020, 11:04:03 PM5/25/20
to DBFluteユーザの集い
志水です。
jfluteさんこんにちは。

「おはようございます。」の書き出しだったんですが
CDATAと関連の記事みてたらあっという間に昼になってました(笑)


>いま初めて Blazor webassembly という言葉を聞いたところではありますが...
実は私も3カ月程前に知り、リリースを待っていました(笑)
次のNET5.0になるとNET COREとFrameworkが一つになるらしいです。
現状のWindows Fromは継承されるようですが
WebFormは対象外となるみたいです(泣)
サポート期間を考えるとあと10年くらいは大丈夫かとは思うのですが
じゃあ、いつ切り替えるんだ?ってことになるので
これを機にWEB系の新規開発はMVC以降のものを利用するのが
いいのかと。


>// ASP.NET Core Blazor C# で CData ADO.NET Provider kintone を使う 
おぉ、こんなものが世の中にあったんですね。
API Serverなんてのもある。すごいなぁ。。
どこまでできるのかだけど
WebAPIって作り方もだけどセキュリティが一番敷居が高いのでちょっと魅力的やなぁ・・・


余談ですが、前の質問の中でにWebApiっていう手段もという話があったのでちょっと試してみたのですが
通常、WebAPIからJSON形式で取得した際にコードの名称などマスタで管理しているものは
(例えば受注テーブル内の担当者コードの担当者名など)
DBFluteのSetup_xxxxxxするみたいに名称も一緒に取得して
Setup_xxxxで取得した際のクラスをそのまま授受しようとしたのですが
Json形式とクラス形式?にそのまま相互変換できなかったんでよね。
こういうのって、クラスの中にクラスを持つようなものでない(上手く説明できないorz)
別のWebAPI用のフラットなクラス定義を作成して、それに入れ替えて授受するのが一般的なんでしょうか?



>あとは、たしかに Quill (裏側S2Container.NET) が動くかどうか? 
>というのは不安になるところですね。それなりに内部の仕組みが複雑なところですから。 
これが一番よくわからないですね。
もしかしたら.NET5.0になれば合体するので普通にイケるのかもしれないけど。

WEBFormでのQuillはコントロールを張り付けだったけれど
WebApiやBlazorは張り付けできないので
試してみるとして、
            QuillInjector.GetInstance().Inject(this);
API呼び出す度にインジェクションしてるんですが
一応、これでDB接続とかはASP.NETのWebAPIで試したところ接続はできるのですが
実用としてこれでいいのですかね?



長文スイマセン。。
以上、宜しくお願い致します。




















2020年5月25日月曜日 20時37分31秒 UTC+9 jflute:

kubo

unread,
May 26, 2020, 2:19:42 AM5/26/20
to DBFluteユーザの集い
jfluteです

> 次のNET5.0になるとNET COREとFrameworkが一つになるらしいです。

おおぉ、そうなんですね


> こういうのって、クラスの中にクラスを持つようなものでない(上手く説明できないorz)
> 別のWebAPI用のフラットなクラス定義を作成して、それに入れ替えて授受するのが一般的なんでしょうか?

フラットかどうかは別にして、少なくともDBのEntityクラスのままJSONにすることは、まずないです。

JavaのExampleになってしまいますが、検索したEntityのリストを、Resultクラスのリストに変換してからJSONにしています。
この場合、フラットにしていますね。
https://github.com/lastaflute/lastaflute-example-harbor/blob/master/src/main/java/org/docksidestage/app/web/lido/product/LidoProductListAction.java#L102

こちらなんかは、ネスト構造ガンガン使ってますが、あくまで戻すJSONに対応した構造ぴったりのクラスを新しく作っています。
https://github.com/dbflute/dbflute-intro/blob/develop/src/main/java/org/dbflute/intro/app/web/client/ClientRowResult.java

もし、外部に公開するJSONの構造がDBの構造と一致してしまうと、DBの構造が変わったときの影響範囲の呼び出してるシステムまで波及してしまいます。
また、不要なデータ(カラム)までネットワーク上を走らせてしまう可能性がありますから、パフォーマンス的にもよくありません。
なので、「JSONの構造」と「DBの構造」は必ず別のクラスにして、サーバー上でデータを詰め替えています。

DBFluteのEntityクラスも、EntityクラスをそのままJSONに変換するのを推奨していません。


> 試してみるとして、
> QuillInjector.GetInstance().Inject(this);
> API呼び出す度にインジェクションしてるんですが

ちょっとQuillInjectorをだいぶ忘れてしまいましたが...Inject() は、基本的に1インスタンスに付き1回で十分なはずです。
該当のクラスのインスタンスが Singleton であれば初期化時に一回だけでいいですし、Prototype (毎回newされる)
であればnewされるたびに必要です。

その this のクラスのインスタンスのライフサイクルを確認してみると良いと思います。
一方で、アクセス負荷の高いシステムでなければ、つど Inject() しちゃっても実害はないかもしれませんが...

志水正幸

unread,
May 26, 2020, 9:11:33 PM5/26/20
to DBFluteユーザの集い
志水です。
jfluteさんおはようございます。

>もし、外部に公開するJSONの構造がDBの構造と一致してしまうと、DBの構造が変わったときの影響範囲の呼び出してるシステムまで波及してしまいます。
あっそうか。外部公開となるとまずいですね。

>「JSONの構造」と「DBの構造」は必ず別のクラスにして、サーバー上でデータを詰め替えています。
>DBFluteのEntityクラスも、EntityクラスをそのままJSONに変換するのを推奨していません。
そうなんですね。やっぱり詰め替えが必要なんですね。
うーん。勉強になるなぁ。。

>ちょっとQuillInjectorをだいぶ忘れてしまいましたが...Inject() は、基本的に1インスタンスに付き1回で十分なはずです。
なるほど。。サーバ側実行時に一発やってればいけそうですね。。


ちょっとBlazorのソリューションにDBFlute関連のプロジェクト組み込んでみました。
ただ、対象のフレームワークは.NET Coreを選択できなかったのでFrameWork4.6ですが・・・、一応ビルドは正常終了しました。
.NETCoreのクロスプラットフォーム対応ができなくなりますが、LINUXは昔Java使ってるときにえらい目にあったので見たくないのでまぁいいかと。。。

しかしフレームワーク違うので実際呼び出せるけど利用可能なのかな??

で、実行するとQuillInjector.GetInstance().Inject(this);したときに
System.TypeInitializationException: 'The type initializer for 'log4net.Core.LoggerManager' threw an exception.'
FileNotFoundException: Could not load file or assembly 'System.Configuration.ConfigurationManager, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. 指定されたファイルが見つかりません。と早速エラーとなりました。
なにか足らないらしいです。。
現在、試行錯誤中です。。。






2020年5月26日火曜日 15時19分42秒 UTC+9 jflute:

志水正幸

unread,
May 27, 2020, 5:19:54 AM5/27/20
to DBFluteユーザの集い
志水です。

Log4netの部分は
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
を宣言することでアセンブリを使ってコンフィグ読込ができてエラーは解消されたのですが
今度は、QuillConfigクラスのQuillConfig(QuillContainer container, string configPath)メソッドでlog4netと同じようにアセンブリが無くてLoadできないエラーとなってしまいました。

※containerは取れてきているようですがconfigPathの中身はnullでした。
System.IO.FileNotFoundException: 'Could not load file or assembly 'System.Configuration.ConfigurationManager, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. 指定されたファイルが見つかりません。'
        protected QuillConfig(QuillContainer container, string configPath)
        {
            _container = container;
            _section = LoadQuillSection(configPath);
        }


log4netのような感じで解決できそうにないのでドン詰まりとなってしまいました。
やっぱりそのままでは利用できない感じですね・・・
しかし解決策がまったく思い浮かばないですわ(笑)
あきらめるしかないかなぁ


kubo

unread,
May 27, 2020, 8:06:02 AM5/27/20
to DBFluteユーザの集い
jfluteです

> 今度は、QuillConfigクラスのQuillConfig(QuillContainer container, string configPath)メソッドでlog4netと同じようにアセンブリが無くてLoadできないエラーとなってしまいました。

ふむぅ、という感じですねぇ...

さすがにこの辺の話であれば dotNET に詳しい方がいる seasar-dotnet-ML で聞いてみたほうがいいかもですね。
(メール見てる人いるのかなぁ...何人かはいるとは思いますが)

もしくは、dotNET関連のコミュニティのメーリングリストみたいなのあれば、聞いてみるといいかもです。
(どういうコミュニティがあるのかわからないですが)

taknb2nch

unread,
May 27, 2020, 10:32:29 AM5/27/20
to dbf...@googlegroups.com
taknb2nchです。

私も最近の.NETは疎いのですが、
System.Configuration が参照に追加されてないぽいメッセージですね。

少しソース追いかけてみましたが、
configPathが未指定の場合、App.config -> Seasar.Quill.dll.config -> 指定の外部config の順で読み込もうとしているようですね。
おそらく未指定でいいんでしょうね。

いずれも読み込める場所にないのでしょうか。

Quill設定ファイルパスを指定する場合は、
QuillContainerインスタンス生成、QuillConfig.InitializeQuillConfig呼び出し前に設定して下さい
とソースにコメントありますね。  

ご参考になれば。

以上、よろしくお願いいたします。

2020年5月27日(水) 21:06 kubo <dbf...@gmail.com>:
--
このメールは Google グループのグループ「DBFluteユーザの集い」の登録者に送られています。
このグループから退会し、グループからのメールの配信を停止するには dbflute+u...@googlegroups.com にメールを送信してください。
このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msgid/dbflute/CAALfU-DRaKZ7jjd%2BCU4sZ1eNkin0N0%3DBmbaA4f%3D4tuz%3DCa_jFA%40mail.gmail.com にアクセスしてください。

志水正幸

unread,
May 28, 2020, 5:39:57 AM5/28/20
to DBFluteユーザの集い
志水です。

jfluteさん、taknb2nchさん、こんにちは。

お二人とも色々と参考情報ありがとうございます。

>さすがにこの辺の話であれば dotNET に詳しい方がいる seasar-dotnet-ML で聞いてみたほうがいいかもですね。
おかげさまでQuillInjector.GetInstance().Inject(this)は通るようになりました。
でも生成失敗で以下のエラーがでるようになりました。
Castle.DynamicProxy.dllがSeasar.Quill.dllは参照してるんですが・・・
seasar-dotnet-ML で聞いてみたいとおもいます。。

Seasar.Quill.Exception.QuillApplicationException
  HResult=0x80131600
  Message=[EQLL0037]プロキシオブジェクト(MTantouDao)の生成に失敗しました。コンストラクタ内の処理、アクセス修飾子、インターセプターを設定しているメソッドがインターフェースor virtualになっているか、Castle.DynamicProxy.dllがSeasar.Quill.dllと同じ場所にあるか等をご確認下さい。
  Source=Seasar.Quill
  スタック トレース:
   at Seasar.Quill.QuillComponent.CreateProxyObject(Type componentType, Type receiptType, IAspect[] aspects) in C:\TEST\Source\s2container.net-1.4.0-RC3\source\Seasar.Quill\QuillComponent.cs:line 270
   at Seasar.Quill.QuillComponent..ctor(Type componentType, Type receiptType, IAspect[] aspects) in C:\TEST\Source\s2container.net-1.4.0-RC3\source\Seasar.Quill\QuillComponent.cs:line 100
   at Seasar.Quill.QuillContainer.GetComponent(Type type, Type implType) in C:\TEST\Source\s2container.net-1.4.0-RC3\source\Seasar.Quill\QuillContainer.cs:line 130
   at Seasar.Quill.QuillInjector.InjectField(Object target, FieldInfo field, Type implType) in C:\TEST\Source\s2container.net-1.4.0-RC3\source\Seasar.Quill\QuillInjector.cs:line 346
   at Seasar.Quill.QuillInjector.InjectField(Object target, FieldInfo field, ImplementationAttribute implAttr) in C:\TEST\Source\s2container.net-1.4.0-RC3\source\Seasar.Quill\QuillInjector.cs:line 333
   at Seasar.Quill.QuillInjector.InjectField(Object target, FieldInfo field) in C:\TEST\Source\s2container.net-1.4.0-RC3\source\Seasar.Quill\QuillInjector.cs:line 269
   at Seasar.Quill.QuillInjector.Inject(Object target) in C:\TEST\Source\s2container.net-1.4.0-RC3\source\Seasar.Quill\QuillInjector.cs:line 191
   at Seasar.Quill.QuillInjector.InjectField(Object target, FieldInfo field, Type implType) in C:\TEST\Source\s2container.net-1.4.0-RC3\source\Seasar.Quill\QuillInjector.cs:line 349
   at Seasar.Quill.QuillInjector.InjectField(Object target, FieldInfo field, ImplementationAttribute implAttr) in C:\TEST\Source\s2container.net-1.4.0-RC3\source\Seasar.Quill\QuillInjector.cs:line 333
   at Seasar.Quill.QuillInjector.InjectField(Object target, FieldInfo field) in C:\TEST\Source\s2container.net-1.4.0-RC3\source\Seasar.Quill\QuillInjector.cs:line 269
   at Seasar.Quill.QuillInjector.Inject(Object target) in C:\TEST\Source\s2container.net-1.4.0-RC3\source\Seasar.Quill\QuillInjector.cs:line 191
   at Seasar.Quill.QuillInjector.InjectField(Object target, FieldInfo field, Type implType) in C:\TEST\Source\s2container.net-1.4.0-RC3\source\Seasar.Quill\QuillInjector.cs:line 349
   at Seasar.Quill.QuillInjector.InjectField(Object target, FieldInfo field, ImplementationAttribute implAttr) in C:\TEST\Source\s2container.net-1.4.0-RC3\source\Seasar.Quill\QuillInjector.cs:line 333
   at Seasar.Quill.QuillInjector.InjectField(Object target, FieldInfo field) in C:\TEST\Source\s2container.net-1.4.0-RC3\source\Seasar.Quill\QuillInjector.cs:line 269
   at Seasar.Quill.QuillInjector.Inject(Object target) in C:\TEST\Source\s2container.net-1.4.0-RC3\source\Seasar.Quill\QuillInjector.cs:line 191
   at BlazorApp5.Server.Controllers.WeatherForecastController.Get() in C:\Users\admin\source\repos\BlazorApp5\BlazorApp5\Server\Controllers\WeatherForecastController.cs:line 52
   at Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(Object target, Object[] parameters)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.SyncObjectResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeActionMethodAsync()
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeNextActionFilterAsync()

内部例外 1:
MissingMethodException: Method not found: 'System.Reflection.Emit.AssemblyBuilder System.AppDomain.DefineDynamicAssembly(System.Reflection.AssemblyName, System.Reflection.Emit.AssemblyBuilderAccess)'.





2020年5月27日水曜日 23時32分29秒 UTC+9 taknb2nch:
taknb2nchです。

私も最近の.NETは疎いのですが、
System.Configuration が参照に追加されてないぽいメッセージですね。

少しソース追いかけてみましたが、
configPathが未指定の場合、App.config -> Seasar.Quill.dll.config -> 指定の外部config の順で読み込もうとしているようですね。
おそらく未指定でいいんでしょうね。

いずれも読み込める場所にないのでしょうか。

Quill設定ファイルパスを指定する場合は、
QuillContainerインスタンス生成、QuillConfig.InitializeQuillConfig呼び出し前に設定して下さい
とソースにコメントありますね。  

ご参考になれば。

以上、よろしくお願いいたします。

2020年5月27日(水) 21:06 kubo <dbf...@gmail.com>:
jfluteです

> 今度は、QuillConfigクラスのQuillConfig(QuillContainer container, string configPath)メソッドでlog4netと同じようにアセンブリが無くてLoadできないエラーとなってしまいました。

ふむぅ、という感じですねぇ...

さすがにこの辺の話であれば dotNET に詳しい方がいる seasar-dotnet-ML で聞いてみたほうがいいかもですね。
(メール見てる人いるのかなぁ...何人かはいるとは思いますが)

もしくは、dotNET関連のコミュニティのメーリングリストみたいなのあれば、聞いてみるといいかもです。
(どういうコミュニティがあるのかわからないですが)

--
このメールは Google グループのグループ「DBFluteユーザの集い」の登録者に送られています。
このグループから退会し、グループからのメールの配信を停止するには dbf...@googlegroups.com にメールを送信してください。
このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msgid/dbflute/CAALfU-DRaKZ7jjd%2BCU4sZ1eNkin0N0%3DBmbaA4f%3D4tuz%3DCa_jFA%40mail.gmail.com にアクセスしてください。
Reply all
Reply to author
Forward
0 new messages