検索
ホームページバックエンド開発C#.Net チュートリアル.NET プロジェクトでの PostSharp の使用

PostSharp は Aspect 指向プログラミングのアスペクト指向 (またはアスペクト指向) コンポーネント フレームワーク であり、.NET 開発に適しています。この記事では主に .NET 開発における Postsharp の関連知識を紹介します。ログ、キャッシュ、トランザクション処理、例外処理、その他の一般的な側面の処理操作など。

AOP (アスペクト指向プログラミング) は、関数の補助機能をビジネスロジックから分離するプログラミングのジェネリック(プログラミングパラダイム)です。その目的は、横断的な関心事を分離することであり、プログラムはより高いモジュール性の特性を持っています。 。 AOP は、コーディング実装レベルでのアスペクト指向ソフトウェア開発 (アスペクト指向ソフトウェア開発) を具体的に表現したものです。

デカップリングはプログラマーがコーディングと開発のプロセスで追求してきたものであることを私たちは知っており、AOP もデカップリングのために生まれました。 AOP テクノロジーの導入により、コーディングが大幅に簡素化され、コピーされるコードの量が減り、ロギング、キャッシュ、トランザクション処理、例外処理、その他の一般的に使用される処理などのコードの統一された部分の保守が容易になります。

1. AOP フレームワークの紹介

1) AOP テクノロジーの紹介

AOP テクノロジーは、カプセル化された オブジェクト の内部を分析し、複数のパブリックに影響を与えるものを結合するために「クロスカッティング」と呼ばれるテクノロジーを使用します。クラスのbehaviorは再利用可能なモジュールにカプセル化され、「Aspect」、つまりアスペクトと名付けられます。いわゆる「アスペクト」とは、簡単に言えば、システム内のコードの重複を減らし、結合を減らすために、ビジネスとは関係がないが、ビジネス モジュールによって共同で呼び出されるロジックや責任をカプセル化することです。モジュール間の信頼性を高め、将来の信頼性を高めます。 AOP は水平関係を表します。「オブジェクト」がオブジェクトのプロパティと動作をカプセル化する中空の円筒である場合、アスペクト指向プログラミング手法は、これらの中空の円筒を切断して情報を取得するようなものです。その内部。カットされた部分はいわゆる「アスペクト」です。そして、これらの切断部分を驚異的な技術で跡形もなく復元しました。 「横断的」テクノロジーを使用して、AOP はソフトウェア システムを 2 つの部分 (中核的な懸念事項と横断的な懸念事項) に分割します。業務処理のメインプロセスが中心的な関心事であり、それとあまり関係のない部分が横断的な関心事です。横断的な懸念事項の特徴の 1 つは、それらが中核的な懸念事項内の複数の場所で発生することが多いですが、本質的にはどこでも同様であるということです。権限認証、ロギング、トランザクション処理など。 Aop の役割は、システム内のさまざまな懸念事項を分離し、中核的な懸念事項と横断的な懸念事項を分離することです。アバナードのシニア ソリューション アーキテクトであるアダム マギー氏が述べたように、AOP の中心的な考え方は、「

アプリケーション

プログラムのビジネス ロジックを、

を提供する一般的な

サービス

から分離する」ことです。 2) AOP の使用シナリオ

AOP は横断的な懸念事項をカプセル化するために使用され、次のシナリオで使用できます:

認証

キャッシュ

コンテキストの受け渡し

エラーハン

dl

ing エラー処理 遅延読み込み

デバッグ

ロギング、トレース、プロファイリング、モニタリング

Per

for

パフォーマンスの最適化

永続性

Reソース

プーリング リソースプール

Synchronization 同期

Transactions Transactions

3) PostSharp フレームワーク

PostSharp は、.NET プラットフォーム上で AOP を実装するためのフレームワークです。公式 Web サイトは http://www. php.cn/.現在の最新バージョンは4.Xですが、有料のAOPソフトウェアです。

PostSharp は AOP を実装するために staticウィービングを使用します。その接続ポイントは非常に豊富で使いやすいです。.NET プラットフォーム上の 他の AOP フレームワークと比較して、PostSharp は比較的軽量ですが、その機能はまったく劣っていません。 。

一般に、PostSharp を使用すると次の利点が得られます:

  • 横断的な関心事が個別に分離されるため、コードの明瞭さと保守性が向上します。

  • 補助機能のコードをAspectで記述しておけば、作業負荷や冗長なコードがある程度軽減されます。

もちろん、PostSharp の使用にはいくつかの欠点もあります。主な欠点は次のとおりです。

  • デバッグの難易度が高くなります。

  • AOPを使用しないコードと比較すると、作業効率が低下します。

しかし、これらの欠点と比較して、PostSharp を使用すると、開発効率が大幅に向上し、重複コードが削減され、コードの可読性と保守性が向上します。

さらに、GitHub にはオープンソースの AOP コンポーネントがいくつかあります。たとえば、一番上のものは KingAOP (http://www.php.cn/) ですが、これは実装に動的メソッドを使用しているため、構築されたオブジェクトを以下に示します。


dynamic helloWorld = new HelloWorld();
helloWorld.HelloWorldCall();

そのため、より便利で、使用習慣は PostSharp に似ていると主張していますが、オブジェクトの作成方法が変更されるため、一般的なプロジェクトでのクラス オブジェクトの処理には適していません。したがって、私は今でも AOP プログラミング開発には PostSharp を使用することを好みます。

2. PostSharp フレームワークの使用

1) PostSharp のコンパイル環境を準備します

現在の PostSharp のバージョンは公式サイトからダウンロードして使用しましたが、『接続エラー』が発生しました。パイプサーバー」というメッセージが頻繁に発生しました。詳細については previous warnings を参照してください。」というメッセージが表示され、単純に 3.x バージョンを使用しましたが、普通に使用でき、非常に優れています (笑)。

PostSharp は VS にインストールできるプラグインです。インストール後、以下に示すように、VS のメニュー列に PostSharp メニュー項目が追加されます。

一般的なプロジェクトでPostSharpの機能を使用する必要がある場合は、プロジェクトのプロパティの[PostSharp]オプションページで、[このプロジェクトにPostSharpを追加する]を使用して、PostSharpをプロジェクトに追加して使用します。

追加後、PostSharp プラグイン プロンプト ダイアログ ボックスがポップアップ表示され、以下に示すように、対応する PostSharp パッケージおよびその他のコンテンツが追加されることが示されます。

完了後、プロジェクトでPostSharp関連クラスを使用できるようになります。

2) PostSharp の AOP アスペクト処理を追加します

各アスペクト クラスの名前は「XXXAttribute」の形式でなければならないことが一般的に合意されています。このうち「XXX」がこのアスペクトの名前です。 PostSharp は、

継承

するための豊富な組み込みの「Base Aspect」を提供しており、その中で「OnMethodBoundaryAspect」を継承します。このアスペクトは、入口関数や出口関数などの接続ポイント メソッドを提供します。さらに、「[Serializable]」を Aspect に設定する必要があります。これは、PostSharp の内部の Aspect のライフサイクル管理に関連します。 ログのAspectクラスのコードは以下の通りです。

    [Serializable]    public class LogAttribute : OnMethodBoundaryAspect
    {        public override void OnEntry(MethodExecutionArgs args)
        {
            Console.WriteLine(Environment.NewLine);

            Console.WriteLine("Entering [ {0} ] ...", args.Method);            base.OnEntry(args);
        }        public override void OnExit(MethodExecutionArgs args)
        {
            Console.WriteLine("Leaving [ {0} ] ...", args.Method);            base.OnExit(args);
        }
    }

例外処理のクラスコードは以下の通りです。


    [Serializable]    public class ExceptionAttribute : OnExceptionAspect
    {        public override void OnException(MethodExecutionArgs args)
        {
            Console.WriteLine(String.Format("Exception in :[{0}] , Message:[{1}]", args.Method, args.Exception.Message));
            args.FlowBehavior = FlowBehavior.Continue;            base.OnException(args);
        }
    }
タイミング処理を行うAspectクラスのコードは以下の通りです。


    [Serializable]
    [MulticastAttributeUsage(MulticastTargets.Method)]    public class TimingAttribute : PostSharp.Aspects.OnMethodBoundaryAspect
    {
        [NonSerialized]
        Stopwatch _StopWatch;        public override void OnEntry(PostSharp.Aspects.MethodExecutionArgs args)
        {
            _StopWatch = Stopwatch.StartNew();            base.OnEntry(args);
        }        public override void OnExit(PostSharp.Aspects.MethodExecutionArgs args)
        {
            Console.WriteLine(string.Format("[{0}] took {1}ms to execute",              new StackTrace().GetFrame(1).GetMethod().Name,
                _StopWatch.ElapsedMilliseconds));            base.OnExit(args);
        }
    }
トランザクション処理用のAspectクラスのコードは以下の通りです。


    [Serializable]
    [AspectTypeDependency(AspectDependencyAction.Order, AspectDependencyPosition.After, typeof(LogAttribute))]    public class RunInTransactionAttribute : OnMethodBoundaryAspect
    {
        [NonSerialized]
        TransactionScope TransactionScope;        public override void OnEntry(MethodExecutionArgs args)
        {            this.TransactionScope = new TransactionScope(TransactionScopeOption.RequiresNew);
        }        public override void OnSuccess(MethodExecutionArgs args)
        {            this.TransactionScope.Complete();
        }        public override void OnException(MethodExecutionArgs args)
        {
            args.FlowBehavior = FlowBehavior.Continue;
            Transaction.Current.Rollback();
            Console.WriteLine("Transaction Was Unsuccessful!");
        }        public override void OnExit(MethodExecutionArgs args)
        {            this.TransactionScope.Dispose();
        }
    }
以下は、いくつかの Aspect クラスのアスペクト処理コードです。


        [Exception]
        [Log]        static void Calc()
        {            throw new pideByZeroException("A Math Error Occured...");
        }

        [Log, Timing]        static void LongRunningCalc()
        {            //wait for 1000 miliseconds
            Thread.Sleep(1000);
        }
上記から、従来の例外処理とログ処理が属性を通じて処理され、特定のビジネス ロジック コードのみが関数本体に残され、コードが読みやすく、簡潔で明確であることがわかります。 。


上記のコード関数呼び出しを実行すると、出力ログで特定の結果を確認できます。

Entering [ Void Calc() ] ...
“System.pideByZeroException”类型的第一次机会异常在 PostSharpExample.exe 中发生
Exception in :[Void Calc()] , Message:[A Math Error Occured...]
Leaving [ Void Calc() ] ...


Entering [ Void LongRunningCalc() ] ...
Leaving [ Void LongRunningCalc() ] ...
[LongRunningCalc] took 1002ms to execute

这样,通过声明的方式,就实现了常规日志 、异常的处理,当然实际项目上使用日志、异常处理的这些代码肯定会更加复杂一些,不过小例子已经实现了切面逻辑的分离处理了,尘归尘、土归土,一切都是那么的简洁安静了。

 

以上が.NET プロジェクトでの PostSharp の使用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
C#と.NETランタイム:それらがどのように連携するかC#と.NETランタイム:それらがどのように連携するかApr 19, 2025 am 12:04 AM

C#と.NETランタイムは密接に連携して、開発者に効率的で強力なプラットフォームの開発機能に力を与えます。 1)C#は、.NETフレームワークとシームレスに統合するように設計されたタイプセーフおよびオブジェクト指向のプログラミング言語です。 2).NETランタイムは、C#コードの実行を管理し、ガベージコレクション、タイプの安全性、その他のサービスを提供し、効率的でクロスプラットフォームの操作を保証します。

C#.NET開発:始めるための初心者向けガイドC#.NET開発:始めるための初心者向けガイドApr 18, 2025 am 12:17 AM

C#.NET開発を開始するには、次のことが必要です。1。C#の基本的な知識と.NETフレームワークのコア概念を理解する。 2。変数、データ型、制御構造、関数、クラスの基本概念をマスターします。 3。LINQや非同期プログラミングなど、C#の高度な機能を学習します。 4.一般的なエラーのためのデバッグテクニックとパフォーマンス最適化方法に精通してください。これらの手順を使用すると、C#.NETの世界に徐々に浸透し、効率的なアプリケーションを書き込むことができます。

C#と.NET:2つの関係を理解し​​ますC#と.NET:2つの関係を理解し​​ますApr 17, 2025 am 12:07 AM

C#と.NETの関係は切り離せませんが、同じものではありません。 C#はプログラミング言語であり、.NETは開発プ​​ラットフォームです。 C#は、コードの書き込み、.NETの中間言語(IL)にコンパイルされ、.NET Runtime(CLR)によって実行されるために使用されます。

c#.netの継続的な関連性:現在の使用法を見るc#.netの継続的な関連性:現在の使用法を見るApr 16, 2025 am 12:07 AM

C#.NETは、複数のアプリケーション開発をサポートする強力なツールとライブラリを提供するため、依然として重要です。 1)C#は.NETフレームワークを組み合わせて、開発を効率的かつ便利にします。 2)C#のタイプの安全性とゴミ収集メカニズムは、その利点を高めます。 3).NETは、クロスプラットフォームの実行環境とリッチAPIを提供し、開発の柔軟性を向上させます。

Webからデスクトップまで:C#.NETの汎用性Webからデスクトップまで:C#.NETの汎用性Apr 15, 2025 am 12:07 AM

c#.netisversatileforbothwebanddesktopdevelopment.1)forweb、useasp.netfordynamicapplications.2)fordesktop、equindowsorwpfforrichinterfaces.3)usexamarinforcross-platformdeveliment、enabling deshacrosswindows、

c#.net and the Future:新しいテクノロジーへの適応c#.net and the Future:新しいテクノロジーへの適応Apr 14, 2025 am 12:06 AM

C#と.NETは、継続的な更新と最適化を通じて、新しいテクノロジーのニーズに適応します。 1)C#9.0および.NET5は、レコードタイプとパフォーマンスの最適化を導入します。 2).Netcoreは、クラウドネイティブおよびコンテナ化されたサポートを強化します。 3)ASP.Netcoreは、最新のWebテクノロジーと統合されています。 4)ML.NETは、機械学習と人工知能をサポートしています。 5)非同期プログラミングとベストプラクティスはパフォーマンスを改善します。

c#.netはあなたにぴったりですか?その適用性の評価c#.netはあなたにぴったりですか?その適用性の評価Apr 13, 2025 am 12:03 AM

c#.netissuitableforenterprise-levelApplicationsとsystemduetoitsSystemdutyping、richlibraries、androbustperformance.

.NET内のC#コード:プログラミングプロセスの調査.NET内のC#コード:プログラミングプロセスの調査Apr 12, 2025 am 12:02 AM

.NETでのC#のプログラミングプロセスには、次の手順が含まれます。1)C#コードの作成、2)中間言語(IL)にコンパイルし、3).NETランタイム(CLR)によって実行される。 .NETのC#の利点は、デスクトップアプリケーションからWebサービスまでのさまざまな開発シナリオに適した、最新の構文、強力なタイプシステム、および.NETフレームワークとの緊密な統合です。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境