AOP(アスペクト指向プログラミング)は、事前にコンパイルして実行ダイナミック・エージェント技術の間の道で統一されたプログラム機能のメンテナンスを実施します。AOPはOOPの継続が関数型プログラミングヤンShengfanタイプです。AOPは、開発の効率を向上させつつ、ビジネス・ロジックは、プログラムの再利用性を向上させ、部品間の結合度を低減するようなビジネス・ロジックの各部分を分離するために使用することができます。
AspectCoreは新しい軽量とモジュラーAOPのソリューションを提供し、今Asp.Netコアをサポートしています。
AOPクラスTransactionalAttributeを実装します。
1 /// <まとめ> 2 ///は、作業の一貫性のトランザクション単位を提供する 3。 /// </要約> 4。 パブリック クラスTransactionalAttribute:AbstractInterceptorAttribute 。5 { 6 IUnitOfWork _unitOfWork { GET、SET ;} 。7 。8 公共 非同期 オーバーライドタスク起動(AspectContextコンテキスト、AspectDelegate次へ) 9 { 10 トライ 。11 { 12は _unitOfWork context.ServiceProvider.GetService =(typeof演算(IUnitOfWork))ASIUnitOfWork; 13 _unitOfWork.BeginTransaction()。 14 のawait 次(コンテキスト) 15 _unitOfWork.Commit()。 16 } 17 キャッチ(例外) 18 { 19 _unitOfWork.Rollback()。 20 スロー; 21 } 22 } 23 }
:それはUnitOfWorkのクラスは、以前の記事で説明した参照AspectCore.Abstractions.dllライブラリコードでなければなりません.NetCore研究ノート:まず、仕事のUnitOfWorkのユニット。
データベースを読み書きするとき_unitOfWork.DbTransactionが追加されます。次のコマンドを実行しDapperの例です:
_unitOfWork.DbConnection.Execute(SQL、PARAM:PARAM、トランザクション:_unitOfWork.DbTransaction、CommandTypeを:CommandTypeを)。
Webアプリケーションの設定を追加します。
1つの パブリック クラスプログラム 2 { 3 パブリック 静的 ボイドメイン(文字列[]引数) 4 { 5 CreateHostBuilder(引数).Build()を実行()。 6 } 7 8 パブリック 静的 IHostBuilder CreateHostBuilder(文字列 []引数)=> 9 Host.CreateDefaultBuilder(引数) 10 .ConfigureWebHostDefaults(webBuilder => 11 { 12 webBuilder.UseStartup <起動時> (); 13 }) 14 .UseDynamicProxy()。// aspcectcore 15 }
netcore3.1構成では比較的簡単ですが、ちょうどそれに()ProgramクラスにUseDynamicProxyを追加します。
そのような事項では、我々はそれにローカルでの使用、[トランザクション]ラベルのクリックを使用する必要があります。
1 パブリック クラスTestService:ITestService 2 { 3 ITestDomain _testDomain { GET。セット; } 4 公共TestService(ITestDomain TESTDOMAIN) 5 { 6 本 ._testDomain = TESTDOMAIN。 7 } 8 9 パブリックテスト取得(文字列ID) 10 { 11 VARのテスト= _testDomain.Get(ID)。 12 戻りテスト; 13 } 14 15 [トランザクション] 16 公共 ボイド挿入(一覧<試験> リスト) 17 { 18 _testDomain.InsertList(リスト)。 19 } 20 }
ITestDomain上部のコードが実行さ:
パブリック クラスTESTDOMAIN:ITestDomain { IRepository <試験> _testRepository { 取得します。セット; } 公共 TESTDOMAIN(IRepository <試験> testRepository) { この ._testRepository = testRepository。 } パブリックテスト取得(文字列ID) { リターン_testRepository.Get(ID)。 } 公共 ボイド挿入(一覧<試験> リスト) { 場合(リスト== NULL ) のリターン; foreachの(VARの項目にリスト) _testRepository.Insert(アイテム) } }
前回の記事では、リポジトリ内のコード・フラグメントは説明しています.NetCore研究ノート:第二に、Dapperの一般的なリポジトリベースを。
AOP事務のこの実現。