目次
1. AOP フレームワークの紹介
2. PostSharp フレームワークの使用
ホームページ バックエンド開発 C#.Net チュートリアル .NET プロジェクトでの PostSharp の使用

.NET プロジェクトでの PostSharp の使用

Mar 12, 2017 pm 03:48 PM
.net

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 までご連絡ください。

ホット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ヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

C言語のnullの代替案は何ですか C言語のnullの代替案は何ですか Mar 03, 2025 pm 05:37 PM

この記事では、CのNull Poernter recerferenceの課題を調査します。問題は、問題はnullではなく、その誤用であると主張しています。 記事では、参照前のチェック、ポインターInitialiなど、非参照を防止するためのベストプラクティスの詳細

次のレベルのCコンパイラを追加する方法 次のレベルのCコンパイラを追加する方法 Mar 03, 2025 pm 05:44 PM

この記事では、printf内の\ nエスケープシーケンスを使用してcで新しいライン文字を作成し、関数を置く方法について説明します。 機能を詳しく説明し、出力のラインブレークに使用することを示すコード例を提供します。

どの言語コンパイラが優れていますか? どの言語コンパイラが優れていますか? Mar 03, 2025 pm 05:39 PM

この記事は、Cコンパイラの選択に関する初心者を案内しています。 GCCは、使いやすさ、幅広い可用性、広範なリソースが初心者に最適であるため、最適であると主張しています。 ただし、GCC、Clang、MSVC、およびTCCも比較して、その違いを強調しています

nullは、C言語での最新のプログラミングではまだ重要ですか? nullは、C言語での最新のプログラミングではまだ重要ですか? Mar 03, 2025 pm 05:35 PM

この記事では、現代のCプログラミングにおけるNullの継続的な重要性を強調しています。 進歩にもかかわらず、Nullは明示的なポインター管理にとって重要なままであり、有効なメモリアドレスがないことをマークすることにより、セグメンテーションの障害を防ぎます。 最高のPRAC

C言語コンパイラのWebバージョンは何ですか? C言語コンパイラのWebバージョンは何ですか? Mar 03, 2025 pm 05:42 PM

この記事では、初心者向けのオンラインCコンパイラをレビューし、使いやすさとデバッグ機能に焦点を当てています。 OnlineGDBとRepl.itは、ユーザーフレンドリーなインターフェイスと役立つデバッグツールのために強調表示されます。 プログラムやコンパイルなどのその他のオプション

C言語コンパイラによるコードをコピーする方法 C言語コンパイラによるコードをコピーする方法 Mar 03, 2025 pm 05:43 PM

この記事では、C IDEでの効率的なコードコピーについて説明します。 コピーはコンパイラ機能ではなくIDE機能であり、IDE選択ツールの使用、コード折りたたみ、検索/交換、テンプラなど、効率を向上させるための詳細戦略であることを強調しています。

c言語オンラインプログラミングウェブサイトc言語コンパイラ公式ウェブサイトの要約 c言語オンラインプログラミングウェブサイトc言語コンパイラ公式ウェブサイトの要約 Mar 03, 2025 pm 05:41 PM

この記事では、オンラインCプログラミングプラットフォームを比較し、デバッグツール、IDE機能、標準コンプライアンス、メモリ/実行の制限などの機能の違いを強調しています。 「最良の」プラットフォームはユーザーのニーズに依存していると主張しています。

c言語コンパイラインストールチュートリアル(コンピューターバージョン) c言語コンパイラインストールチュートリアル(コンピューターバージョン) Mar 03, 2025 pm 05:41 PM

このチュートリアルは、Windows、MacOS、LinuxにCコンパイラをインストールすることでユーザーをガイドします。 人気のコンパイラ(MINGW、Visual Studio、XCode、GCC)のインストールを詳述し、環境可変構成を説明し、トラブルシューティング手順を提供します

See all articles