サービス コントラクトを含むアセンブリがあります (アセンブリ名は ですContracts
)。属性とPostSharpを使用して、これらのメソッドに承認を実装したいと考えています。認証属性は次のようになります。
public class Auth : System.Attribute
{
public Auth(String permission){...}
}
サービス契約を次のようにしたい:
namespace Contracts
{
public interface IService
{
[Auth("CanCallFoo")]
void Foo();
}
}
Contracts
コンパイル時に、アセンブリ
内のインターフェイスのすべてのメソッドに属性があることを確認したいと考えていAuth
ます。
これを行うために、次のアスペクトを作成しました。
[Serializable]
[MulticastAttributeUsage(MulticastTargets.Interface & MulticastTargets.Method)]
public class EnforceSecurityAspect : OnMethodBoundaryAspect
{
public override bool CompileTimeValidate(System.Reflection.MethodBase method)
{
var hasSecurityAttribute = method.GetCustomAttributes(true).Any(x => x is Auth);
if (!hasSecurityAttribute)
{
throw new InvalidAnnotationException(String.Format("Add `Auth` to `{0}`", method.Name));
}
return base.CompileTimeValidate(method);
}
}
Contracts
アセンブリの AssemblyInfo で次のコード行を使用してアスペクトを適用します。
[assembly: EnforceSecurityAspect()]
同じアセンブリ内に、サービスで使用される DTO もあります。
私が直面している問題は、アスペクトが DTO にも適用されることです
。たとえば、このような DTO があります。
public class Client
{
public String Name{get;set;}
}
コンパイル時Auth
に、コンパイラが生成したget_Name
メソッドに追加する必要があるというエラーが表示されます。
Q: Postsharp にアスペクトをインターフェイスのメソッドにのみ適用するように指示する方法はありますか?