我喜欢ASP.NET MVC中的授权属性。不是属性本身,而是你应用它的方式。
我想在我的非ASP MVC服务层中使用它,最好是在我的普通C#业务逻辑库中,或者至少但不太优选地在我的WCF服务端点的端点。 PostSharp是我唯一的答案还是有免费的类似解决方案?
答案 0 :(得分:1)
我处于类似的情况,最近研究了很多选择。
AOP的一些开源项目有.NET,但大多数似乎被放弃或不活跃。 PostSharp是迄今为止最成熟的。社区版是免费的,可用于商业开发。
其他静态编织者(如PostSharp):
另一种选择是使用动态代理。有一些库使用这种技术,但除了Spring.NET之外,它们似乎或多或少都死了。
我相信Spring.NET AOP可以在没有其余Spring.NET堆栈的情况下使用,但我不完全确定。
如果你不介意在较低级别工作,总会有Mono.Cecil允许你像PostSharp一样重写程序集,但我不推荐它。这将是一项很多工作,很难做到正确。
使用例如Castle.DynamicProxy或LinFu生成动态代理可能是一种更好的方法,但它仍然需要相当多的管道才能使一切工作。此外,除非您已经在使用IoC容器,否则您可能需要考虑这一点,因为这样可以更轻松地在需要的地方注入代理。与在PostSharp中使用OnMethodInvocationAspect或类似工具相比,它将会有更多工作。
我目前倾向于使用PostSharp(社区版),因为它可以完成我需要的一切并且非常易于使用。 Spring.NET似乎有点有趣,但基于动态代理的解决方案不会像PostSharp那样优雅或易于使用。
答案 1 :(得分:0)
有一些解决方案 - 这里有list开源和商业产品。唯一似乎不再存在的是AspectSharp - 该链接已被破坏。其中大部分似乎都没有在一年左右的时间内更新,但它可能是一个开始。 PostSharp也在名单上。
希望这有帮助。
答案 2 :(得分:0)
Microsoft的Unity提供了通过方法拦截编写AOP代码的能力。如果您的拦截方法检查了拦截方法的属性,您应该能够精确地执行您想要的操作。
您可以阅读有关Unity拦截here
的信息答案 3 :(得分:0)
NDecision使决策树业务逻辑的实现变得非常简单,如果您是Gherkin语法和Fluent编码实践的粉丝,您会感到宾至如归。下面的代码快照来自项目站点,并演示了如何实现业务逻辑。 NDecision.Aspects是NDecision之上的AOP层。事实上,NDecision.Aspects使用PostSharp属性,并动态拦截代码执行,以对作为参数传递的对象(或拥有正在执行的方法的对象)应用业务规则。
以下屏幕截图中的代码演示了如何在单独的类中编写业务逻辑:
然后使用NDecision.Aspects属性之一激活规范的自主应用程序(业务规则):
或者通过将属性应用于规范适用的目标类型的方法:
没有理由不能使用“决策树”进行另一个程序集。 NDecision就是为了将逻辑分成一个独立的层而编写的,NDecision.Aspects部分允许在任何需要的地方应用这些规则。
答案 4 :(得分:0)
PrincipalPermissionAttribute
与ASP.NET MVC自己的AuthorizationAttribute
差不多。除了装饰方法而不是动作之外,你以相同的方式使用它。它允许您按用户角色,用户名或仅仅是否已经过身份验证来要求访问:
用户属于管理员角色:
[PrincipalPermission(SecurityAction.Demand, Role = "Administrators")]
public void YourMethod()
{
// do something
}
用户名为 john :
[PrincipalPermission(SecurityAction.Demand, Name = "john")]
public void YourMethod()
{
// do something
}
用户已通过身份验证:
[PrincipalPermission(SecurityAction.Demand, Authenticated = true)]
public void YourMethod()
{
// do something
}
当System.Security.SecurityException
与您的访问规范不匹配时,这些抛出Thread.CurrentPrincipal
。