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

PHPz
リリース: 2017-03-12 15:48:55
オリジナル
4980 人が閲覧しました

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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート