2009-08-20 69 views
0

基本上我试图在C#中实现某种穷人的面向方面编程。我曾考虑过使用ContextAttribute,但他们似乎只能在课堂上进行绑定。有没有什么办法可以将一个属性放在一个属性中,以便它可以接收与它所注释的方法相同的参数,或者以某种方式访问​​它所触发的上下文?在C#中获得属性上下文

我有这样的代码

public void AddUser(User user) 
{ 
    var errors = DataAnnotationsValidationRunner.GetErrors(user); 
    if (errors.Any()) 
      throw new RulesException(errors); 
    users.Add(user); 
} 

从中我想提取的第3行,所以我有这样的事情

[Validated] 
public void AddUser(User user) 
{ 
    users.Add(user); 
} 

回答

2

我想你错过了第三个组件。大多数AOP实现(例如Aspect#)依靠代理或拦截器来实际执行代码。在你的场景中,你缺少需要的组件1)知道属性存在于方法上,2)触发在属性中执行代码所需的机制(或成为它)。

幸运的是,在开源中已经有很多(相当)简单的解决方案。我能想到的最简单的选择是使用编译时编织器,如PostSharp。拿一份那样的样本,在样本中,你会发现几个你想要做的事情的例子(你会对OnMethodInvocationAspect感兴趣)。

最终的结果是您的代码看起来与您提供的示例完全相同,但它也运行您希望的代码。

+0

+1适用于PostSharp – 2009-08-20 21:27:35

+0

这是完美的,我没有意识到有一个C#方面的编织器在某处读取了它是不可能的。我想postsharp从http://zombo.com出来,那里不可能是可能的。 – stimms 2009-08-21 04:03:19

+0

只是FYI,看看Postsharp附带的插件。我知道log4postsharp(它与log4net和postsharp结婚)是以Log []属性的形式出现的,它将记录入口/出口到一个方法(包括反射所有传入的参数(及其值!))。你可以重写那些代码来做任何你想要的验证。它肯定会为你节省一些时间... – 2009-08-21 22:06:14

1

不知道你的解决方案应该究竟如何的样子,但在C#属性中,只要你不请求它们,就不会执行代码(据我所知)。如果你查询属性,你也有上下文。所以在我看来,你的策略出了问题。