.net 接口方法的Postsharp编译时验证
我有一个包含服务契约的程序集(程序集名称为.net 接口方法的Postsharp编译时验证,.net,aop,postsharp,.net,Aop,Postsharp,我有一个包含服务契约的程序集(程序集名称为contracts)。我想使用属性和PostSharp对这些方法实现授权。 授权属性如下所示: public class Auth : System.Attribute { public Auth(String permission){...} } namespace Contracts { public interface IService { [Auth("CanCallFoo")] voi
contracts
)。我想使用属性和PostSharp对这些方法实现授权。
授权属性如下所示:
public class Auth : System.Attribute
{
public Auth(String permission){...}
}
namespace Contracts
{
public interface IService
{
[Auth("CanCallFoo")]
void Foo();
}
}
我希望我的服务合同如下所示:
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);
}
}
我在合同的AssemblyInfo中使用这行代码应用方面
程序集:
[assembly: EnforceSecurityAspect()]
在同一程序集中,我还有DTO,这些DTO由服务使用。我面临的问题是,方面也应用于DTO
例如,我有这样一个DTO
public class Client
{
public String Name{get;set;}
}
在编译时,我得到一个错误,说我应该将Auth
添加到编译器生成的get\u Name
方法中。问:有没有办法告诉Postsharp方面应该只应用于接口的方法
我知道这是一个老问题,但我也想向任何有此问题的人提供答案 虽然可以使用特定的目标来继承/实现postsharp的特定接口/类,但我不知道如何实现 解决这个问题的方法是创建一个方面并以类为目标(还没有,但我确信这是可能的)。然后,您可以使用反射仅验证从某个类/接口继承的类,方法可以是 使用与下面代码类似的东西。(请注意,这是postsharp企业价格功能)
我知道这是一个老生常谈的问题,但我也想为任何有这个问题的人提供一个答案 虽然可以使用特定的目标来继承/实现postsharp的特定接口/类,但我不知道如何实现 解决这个问题的方法是创建一个方面并以类为目标(还没有,但我确信这是可能的)。然后,您可以使用反射仅验证从某个类/接口继承的类,方法可以是 使用与下面代码类似的东西。(请注意,这是postsharp企业价格功能)