2011-08-12 8 views
0

1.0から4.0に成長している.NETを見てきました。しかし、私に迷惑をかける1つの質問があります。クラスの属性がクラスのオブジェクトの特定の動作を変更する方法を教えてください。サードパーティ製のツールを使用しないAspect Oriented Programmingについて学ぶ良いリソース

つまり、WCFを見ると、いくつかの属性を追加すると、そのサービスのオブジェクトの全体的な動作が変更されます。オブジェクトまたはそのメソッドを呼び出す要求を収集し、その同じインスタンスを使用して余分な情報を処理するハンドラがありますか?

私は城やNハイバーネイトのようないくつかのサードパーティ製のツールがこのタスクのためにあることを知っています。私は、クラスまたはそのメソッドやプロパティの特定のオブジェクトの属性処理を処理するための独自のカスタムロジックを作成するために、その背後にある本当のことを知りたいと思います。

正しい方向への助けが大歓迎です。

ありがとうございました。 MB。

答えて

0

ええと、あなたが求めているのは、必ずしもアスペクト指向プログラミングとは関係ありません。むしろAOPフレームワークでは、いわゆる「ポイントカット」をマークする属性を使用することがあります。 「アドバイス」が適用される場所(つまり、タイプが変更される場所)。

通常、クラスの動作を変更するのは属性そのものではありません。彼らは他の何かによって特別な扱いのための型だけを「マーク」します。他のフレームワーク、ライブラリ、バイトコードリライタなどによって、または単に.NET自体によって。

  • 彼らは.NETの実行環境によって異なる方法で処理される任意の追加のツール—のためにも必要としないタイプを「変更」.NETのintrinsical一部であるいくつかの特別な属性があります。 MarshalByRefObjectAttributeのいずれかである可能性があります。 SerializableAttributeは、シリアル化を扱う.NET BCLの重要な要素です。

  • Visual Studio用のWindowsフォームデザイナは、特定の属性のために外を見て

  • 、などなどBrowsableDescription

  • WCFは、属性のために外を見て、のようなOperationContractDataContract

として

ここで理解しなければならない主なポイントは、誰か(たとえそれが.NETであっても)が属性の有無を積極的にチェックし、何かをしなければならないということです。彼ら自身は何もしません!それらは単に他のものに注釈を付けられたデータです。

オブジェクトを取る独自のコンポーネントを記述し、そのオブジェクトの型に定義されている属性があるかどうかを調べることができます(もしそうであれば、別の方法で処理します)。これは、リフレクションを介して行うことができます。

using System.Linq; 
using System.Reflection; 
… 

public class SomeAttribute : Attribute { … } 

void DoSomethingWith<T>(T someObject) // (T is only introduced here for 
{          // easy reference in the comments below.) 
    object[] attribute = 
      someObject.GetType().GetCustomAttributes(typeof(SomeAttribute), true); 

    if (attribute.Any()) 
    { 
     // [SomeAttribute] is present on type T, or T inherits the attribute. 
    } 
    else 
    { 
     // [SomeAttribute] is not present on T. 
    } 
} 

もMSDNのドキュメントを参照してください:System.Type.GetCustomAttributes

関連する問題