2009-12-21 29 views
4

我有一个方法,只有在满足某个条件时才可以访问,如果不是,那么该方法将不会被执行。目前,这是我编写的东西:现在使用属性来检查是否访问方法

public void CanAccessDatabase() 
{ 
    if(StaticClass.IsEligible()) 
    { 
     return; 
    } 
    // do the logic 
} 

,这个代码是丑陋的,因为不出来哪里有这个if(StaticClass.IsEligible())条件是不相关的方法的关注。

所以我正在考虑将IsEligible方法放在属性中,以便我的代码看起来像这样。 如果条件未满足,则此方法将仅返回而不执行下面的逻辑。

[IsEligibleCheck] 
public void CanAccessDatabase() 
{ 
    // do the logic 
} 

资格是一个运行时决定的,当然。

关于如何编码IsEligibleCheck的逻辑的任何想法?谢谢

编辑:我知道PostSharp可以做到这一点,但我正在寻找一些可用的,不依赖任何第三方库的东西。

+0

是一个资格编译时或运行时决定呢? – 2009-12-21 01:27:18

+0

如果某些事情在无法访问时尝试调用该方法,会发生什么情况?异常抛出?沉默失败?垃圾结果? – 2009-12-21 01:27:30

+0

如果这是一个编译时决定,那么你可以使用属性'[Conditional(“CONDITION1”)]' – 2009-12-21 01:39:08

回答

3

如何编写了逻辑IsEligibleCheck任何想法?

这是AOP的绝佳去处。

编辑:我知道PostSharp可以做到这一点,但我正在寻找一些可以用于开箱即用的东西,而不依赖于任何第三方库。

微软认为是第三方?如果没有,你可以从他们的Patterns & Practices teamUnity。看看Unity中的Interceptor机制。

否则,您实际上必须使用反射来滚动自己的实现。有效地,你必须做的是将你的对象包装在代理中,其中代理使用反射来检查属性并适当地解释它们。如果IsEligibleCheck成功,则代理将调用包装对象上的方法。真的,只重用一个已经存在的实现会更容易。

我的建议是使用Unity(或另一种AOP解决方案)。

+0

++用于提示统一性。由于公司要求,我怀疑OP不希望第三方的东西。该公司可能更适合使用MS产品。 – 2009-12-21 01:54:24

+2

我讨厌打破新闻,但模式和实践的东西不被视为MS产品。他们可能建立在MS产品之上,由MS人员构建,但他们不受官方支持。 WCSF也是由P&P人员推出的,在这一点上它几乎是一个废弃的框架。 PostSharp和Castle很可能拥有比模式和实践家伙更多的社区支持。 – Josh 2009-12-21 02:28:25

2

这看起来很适合AOP。简而言之,这意味着CanAccessDatabase逻辑将生活在一个“方面”或“拦截器”中,也就是与业务逻辑分开,因此实现了separation of concerns(该方面只负责安全性,业务代码只负责为商业事情)。

在C#中,用于执行AOP的两个流行选项是Castle.DynamicProxyPostSharp。各有其优点和缺点。 This question总结他们的差异。

Here are other options用于在.Net中执行AOP,其中一些可以在没有第三方库的情况下完成。我仍然建议使用DynamicProxy,PostSharp,LinFu,Spring.AOP或Unity,其他解决方案几乎没有灵活性。

+0

谢谢,因为我可以使用PostSharp或Castle,我更喜欢一些.Net框架内置的,即不依赖于第三方库。 – Graviton 2009-12-21 01:37:58

+0

@Ngu所有的Microsoft.Practices库都是“第三方”正如先前在我的其他评论中所述,他们没有得到官方的支持。 – Josh 2009-12-21 02:30:50

2

自定义属性与Reflection结合在一起。

您将需要创建另一个类,负责调用CanAccessDatabase()类中的方法。

使用反射,这个新类将确定每个方法的属性。如果找到IsEligibleCheck属性,它将执行StatiClass.IsEligible()检查,并且只有在检查通过时才调用CanAccessDatabase()。

继承人an introduction在MSDN上这样做。它围绕使用MemberInfo.GetCustomAttributes()方法进行。

继承人的伪代码:

Get the Type of the CanAccessDatabase() class 
Using this type, get all methods in this class (optionally filtering public, private etc). 
Loop through the list of methods 
    Call GetCustomAttributes() on the current method. 
    Loop through the list of custom attributes 
     If the IsEligibleCheck attribute is found 
      If StaticClass.IsEligible is true 
       Call the current method (using MethodInfo.Invoke()) 
      End If 
     End If 
    End Loop 
End Loop 
+0

谢谢,你有什么例子吗?到目前为止,我得到的所有例子都没有处理前提条件检查。 – Graviton 2009-12-21 01:38:56

+0

我看过你的例子;它所说的就是如何在运行时检查任何方法的属性的存在并对其进行处理。但这意味着我必须专门编写机制来检查属性,并在任何方法执行之前调用'Eligible'类。这就是我希望微软已经写好的那段代码。我所要做的就是找出它。 – Graviton 2009-12-21 01:48:07

+0

@Ngu Soon Hui,是的,如果您自己选择这样做,您需要使用反射来首先检查属性,然后根据您的自定义逻辑执行该方法。如果你不想这样做,你应该使用AOP制药。微软目前不提供AOP作为框架C库的一部分。 – Ash 2009-12-21 01:53:05

2

不幸的是,属性没有在运行时得到执行。一些内置属性修改了编译的代码,如MethodImpl属性和类似属性,但所有自定义属性都只是元数据。如果没有代码去寻找元数据,它就会坐在那里,根本不会影响程序的执行。

换句话说,您需要if语句某处

除非您可以使用像PostSharp这样的工具,否则您无法在开箱即用的.NET中完成此操作,而无需显式检查属性。

0

检查AOP,这将有助于你在这个有很多,在市场上强大的组成部分之一,是PostSharp

相关问题