Transaction.Current
nullの場合にメソッドが呼び出されないようにするメソッドに適用できるカスタム属性を作成しようとしています。現在、その項目がnullの場合に例外をスローする基本的な属性クラスがあります。ここにあります:
[AttributeUsage(AttributeTargets.Method)]
public class RequiresTransactionAttribute : System.Attribute
{
public RequiresTransactionAttribute()
{
if (Transaction.Current == null)
{
throw new Exception("requires transaction");
}
}
}
問題は、これによってメソッド呼び出しがテストで失敗しないことです。
これらの属性はメタデータに変換されることを読みました。そのため、特にリフレクションを使用して属性を実行しない限り、このコンストラクターは最適化されているため、実行されません。
属性アプローチを使用した私のような要件、またはおそらく他のより良いメソッドに基づいてメソッドが呼び出されるのを防ぐことは可能ですか?
非常に少数の例外(JITが彼らのために探しているランタイムによる作り付けの振る舞いと属性-のような[MethodImpl(...)]
またはコード・アクセス・セキュリティ属性)、属性は完全に不活性で-彼らは、メタデータとして純粋に存在します。リフレクションを使用してインスタンス化しない限り、オブジェクトとしてインスタンス化されることはありません。
だから、何も:あなたはこのような実行時の動作に影響を与えることはできませんしない限り、あなたはフレームワークを使用している方法の外に出る方法そのフレームワーク自体のチェックを経て属性を探すために、それらをインスタンス化し、実行可能なコードとして扱います。ASP.NET MVCは、これを行うフレームワークの例です。
もう1つのオプションは、ポストシャープなどのILリライターです。この場合、属性は、織り中に追加のコードを挿入するための一般的なフックです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加