スポンサーリンク

Core WCFで実装するシンプルで高速なDBトランザクション処理(on SQLServer)

.NET CoreASP.NET CoreC#SQL ServerWCF

.Net 6.0 の Core WCFから、Dapper+Microsoft.Data.SqlClient NuGetパッケージを使い、SQL ServerデータベースへDBトランザクション処理を行うサンプルを作成しました。
ORマッピングの主流はDapperになって来てる。
ソースコードはGitHubで公開しています。

Youtube動画だと、DBトランザクション継続中に SQL Server Management Studio側からの接続に対してレスポンスが返って来ないのは、SQL Server側でロックが発生している為です。

ビジネスロジックやデータベース処理を、Repogitoryや Interfaceを駆使して実装すると、ソースコードが複雑になり保守性が下がります。
staticクラスで実装するとソースコードがシンプルになり保守性が高くなります。
staticクラスで実装したソースコードは、ユニットテストの実装も容易です。

Repogitoryや Interfaceを駆使して無駄な処理を大量に実装し、工数が爆発して開発が終わらなくなっているプロジェクトが多過ぎる。駆使するべきはstatic。
いまだに、C#のマルチスレッド処理が分からず「staticを使うのは不安だ」と言っている人がいて、その人の意見が採用され「static禁止」になると、開発工数が爆発します。

Core WCF サーバ側

ソースコード構成

.NET6.0で実装する Core WCF 開発手順 で作成したソースコードを元に、一部修正を加えています。

ソースコード変更内容を解説

/CoreWCFService1.csproj

Dapper/Microsoft.Data.SqlClient NuGetパッケージをインストール。
SQLSeverへ接続するライブラリは、System.Data.SqlClientではなく Microsoft.Data.SqlClientが推奨です。

/appsettings.Development.json

SQLServerへ接続するコネクションストリングを追加。

/Shared/SharedData.cs

・staticメンバ変数で実装した、アプリ全体で使えるコネクションストリング変数を追加。

/Program.cs

・アプリ起動時に環境設定ファイルを読み込み、アプリ全体で使えるコネクションストリング変数にセットする処理を追加。
 環境設定ファイルの読み込み処理をアプリ起動時1回だけにし、アプリ起動後は staticメンバ変数を直接参照することで、処理コストを減らせる。

/Model/TableModels.cs

・SQLServerから取得したデータに対応する、データモデルクラスを追加。

/IService.cs

・SQLServerデータベースに対して、DBトランザクション処理を実行する新しいインターフェース(InsertTableA)を追加。

/SQL/SQL_TableA.cs

・DBトランザクション処理を行う Transaction1メソッドから、Insert SQLを発行する Insertメソッド、Select SQLを発行する Selectメソッドを呼び出しています。
・BeginTransactionでトランザクションを開始し、DBコネクション変数(conn)とトランザクション変数(tran)を各メソッドへ渡し、Dapperを通してSQLを発行することで、とてもシンプルで高速なDBトランザクション処理を実装しています。
・razorページには画面処理のみ、SQLフォルダ配下の staticクラスにはDB処理と、レイヤー分けをしています。
 今回は簡単なロジックなので2レイヤーにしています。業務システムだとビジネスロジックレイヤーのソースコードをDataフォルダ配下に纏め、「画面レイヤー(Pagesフォルダ) => ビジネスロジックレイヤー(Dataフォルダ) => データベースレイヤー(Sqlフォルダ)」と繋げていくイメージです。
 ビジネスロジックレイヤーを設ける場合、トランザクション処理の開始処理(BeginTransaction)はビジネスロジックレイヤーに実装します。
・データベース処理を行う、SQL文を伴うソースコードはSQLフォルダに纏まっていると分かり易い。
・Insert文のパラメータは匿名クラスにし、DapperにSQLとパラメータを渡して、Insert SQLを発行しています。
・データベースとC#側のデータ型が一致していれば、あとは Dapperがバインドしてくれる。
・SQL文は定数化しておくことで処理コストを減らしています。

Core WCF クライアント側

ソースコード構成

.NET6.0で実装する Core WCF 開発手順 のソースコードを元に、一部修正を加えています。

ソースコード変更内容を解説

/Connected Services/ServiceReference1/ConnectedService.json

CoreWCFサーバ側で追加したインターフェースを、CoreWCFクライアント側へ反映したことに伴い自動更新された。必要なパッケージが増えている。
※CoreWCFサーバ側の変更を、CoreWCFクライアント側へ反映する手順は .NET6.0で実装する Core WCF 開発手順 > CoreWCFサーバ側のインターフェース変更をクライアント側へ反映する を参照下さい。

/Connected Services/ServiceReference1/Reference.cs

CoreWCFサーバ側で追加したインターフェースを、CoreWCFクライアント側へ反映したことに伴い自動更新された。
追加したインターフェースのパラメータで使われる、データクラスの定義が増えている。

追加したインターフェースの定義が増えている。

/Form1.cs

ボタンクリック時の処理を、CoreWCFサーバ側に定義されたデータクラスを元にInsert用のデータを作成し、CoreWCFサーバ側で追加したDBトランザクションを行うインターフェースへ渡す処理に変更。

Select対象のDBテーブル構成

コメント

タイトルとURLをコピーしました