スポンサーリンク
スポンサーリンク

ASP.NET Core Web APIで実装するシンプルで高速なDBトランザクション処理(on ORACLE)

.NET CoreASP.NET CoreC#OracleSwaggerVisual StudioWeb APIデータベース

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

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

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

 

ソースコード構成

今回使った Visual Studio プロジェクト テンプレートは、Visual Studio 2022 + .Net 6 + ASP.NET Core Web API アプリ の HTTPS無し。

テンプレートに対して、下記の処理を加えました。

 

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

/WebApplication1.csproj

Dapper/Oracle.EntityFrameworkCore NuGetパッケージをインストール。

 

/appsettings.Development.json

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

 

/Shared/SharedData.cs

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

 

/Program.cs

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

 

/Model/TableModels.cs

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

 

/Controllers/WeatherForecastController.cs

・ORACLEデータベースに対して、DBトランザクション処理を実行する、HTTP POSTリクエストWEBAPIを追加。

 

/SQL/SQL_TABLE1.cs

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

 

Select対象のDBテーブル構成

コメント

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