2013-07-17 72 views
0

我可能没有正确的话,但我已尽力了。执行一种方法在其他几种方法的开始

说我在c#中有一个函数,比如DoWork,并且在那个函数中我想调用另一个函数,比如CheckScore()。但是,CheckScore()是我想从多个地方调用的通用函数。

所以在我的课上,当我创建另一个函数DoWork2时,DoWork3有什么办法可以将CheckScore()作为第一行而不是每次都输入那些代码?

对于如。我能避免

string DoWork2(){ 
CheckScore() 
} 

,而不是仅仅有

string DoWork2(){} 

但CheckScore()是反正执行?

+2

我不认为有一种方法来执行这样的事情(很多语言是明确的)。如果我们知道“CheckScore”的目的是什么,以及为什么每当你调用一个(我假设的)公共方法时需要调用它,可能会有更好的解决方案。 – Matthew

+1

为什么你需要这个功能。您是否有特定的理由要这样做? – Koushik

+0

如果你想访问它,你应该使用'CheckScore'的代表。匿名函数是**内联**。 –

回答

0

这可能不是您正在寻找的内容,但是当访问分数时,我会将“CheckScore”与属性的获取方关联起来。这样,当使用该属性时,感觉你并没有多写出CheckScore,并且每次在应用程序中调用旧方法时都没有调用CheckScore函数。

private int _score; 

    public int Score 
    { 
     get 
     { 
      CheckScore(); 
      return _score; 
     } 
    } 

    public void DoWork1() 
    { 
     if (Score > 10) { 
      // Case 1 
     } 
    } 

    public void DoWork2() 
    { 
     if (Score < 20) { 
      // Case 2 
     } 
    } 
0

鉴于评论的附加信息,一个解决这个问题是创建一个小的类来封装需要身份验证方法:

abstract class AuthenticateClass 
{ 
    private bool AuthenticateUser(){ 
     return true; // do your authentication 
    } 
    public int Perform(){ 
     if (!AuthenticateUser()){ 
      return -1; 
     } else 
      return AuthenticatedMethod(); 
    } 

    protected abstract int AuthenticatedMethod(); 
} 

这给你执行身份验证和一类,如果成功,执行你的方法。实现它想:

class SomeAuthentMethod : AuthenticateClass 
{ 
    protected override int AuthenticatedMethod() 
    { 
     return 10; // whatever method... 
    } 
} 

,并用它喜欢:

SomeAuthentMethod myMethod = new SomeAuthentMethod(); 
if (myMethod.Perform() = -1){ 
    // unable to authenticate user, please log in, etc 
} 

如果认证通过这个返回10,否则返回-1(验证失败)。这使您可以生成任意数量的自动包含身份验证的方法。

或者,你可以使用一个静态类做认证 - 例如:

static class Authenticate 
{ 
    public delegate int MethodDelegate(); 

    private static bool AuthenticateUser(){ 
     return true; // do your authentication 
    } 
    public static int Perform(MethodDelegate MyMethod){ 
     if (!AuthenticateUser()) 
     { 
      return -1; 
     } 
     else return MyMethod(); 
    } 
} 

在哪里然后你可以有:

private int myMethod(){ 
     return 10; //whatever method... 
} 

,然后实现,如:

if (Authenticate.Perform(myMethod) = -1){ 
    // unable to authenticate user, please log in, etc 
} 

很明显,您可以扩展这两种模式来处理“未登录”或“不可认证经过验证的“动作在抽象或静态类本身。这至少应该提供一些如何解决问题的想法。

+0

请记住,如果您使用静态类路由来处理身份验证,那么您将在业务逻辑中的所有位置都有这些静态调用 - 并且如果有一天您需要将身份验证类换成其他内容它可能会变成真正的痛苦。 –

+0

@MikeP - 当然,但不管你如何实现它,无论你如何实现,你最终都会接到这样的调用。我更喜欢抽象类自己;我认为,如果你愿意,可以尽可能多地将它抽象出来。 –

0

将CheckScore放在属性中仍然会导致它被称为很多。

您可以使用私有只读字段并将其设置在构造函数中。这将最大限度地减少对CheckScore的呼叫数量。

public class MyClass 
{ 
    private readonly int _score; 

    public MyClass() 
    { 
     _score = CheckScore(); 
    } 

    public int Score 
    { 
     get 
     { 
      return _score; 
     } 
    } 

    public void DoWork1() 
    { 
     if (Score > 10) { 
      // Case 1 
     } 
    } 

    public void DoWork2() 
    { 
     if (Score < 20) { 
      // Case 2 
     } 
    } 
} 
2

一个潜力,虽然仍然不够安全,但方法是将您的安全检查抽象为属性。这样,您就可以与像装饰你的方法:

[CheckToken] 
public string DoWork() { 
    .... 
} 

这未必是最好的答案,因为它仍然需要你属性的方法。您可以改为为您的Web服务类创建一个属性,该类将在该类的任何方法调用中执行[CheckToken]。

[CheckToken] 
public class MyWebService { 
    ... 
} 

这里唯一的问题是,如果你有,你要执行不同的安全检查,或没有安全检查的一些方法。

具有相当不错的安全功能的C#web服务框架已融入框架中,即服务堆栈。 http://www.servicestack.net/它具有已经构建的安全属性,可以使用它,并且它可以促进对问题的清晰分离。

另一个非常强大的选项涉及拦截方法调用。 C#有一个可用于此目的的类“ContextBoundObject”。您需要让您的类从ContextBoundObject继承,然后才能开始动态地拦截方法调用,并根据正在调用的方法调用的上下文及其参数执行安全检查。 ContextBoundObject的确会给你的通话增加一些开销,所以你需要把它放入你的决定。方法拦截对于诸如安全性,性能监视,运行状况检查,方法重试以及其他横切关注点等方面非常有用。

下面是关于ContextBoundObject(和Aspect Oriented Programming)的简单入门文章。 http://www.codeproject.com/Articles/8414/The-simplest-AOP-scenario-in-C

对于j ...

我不会有方法的代码查询结果。由于我们谈论的是一项Web服务,因此有一个涉及请求由客户端发起的管道,该请求发送给服务,该服务初始化其处理程序,将请求反序列化,将请求路由到适当的方法,执行该方法序列化响应,并将响应返回给客户端(这是一个很大的简化..)。我见过的大多数框架都有一些钩子,用于指定服务方法上的属性,这些属性在方法执行之前被检查并可用于处理安全性(即为Web服务返回401 http代码)。我相信他说他使用的是WCF,虽然我已经使用WCF已经有一段时间了,但我知道这可以完成 - 请参阅http://msdn.microsoft.com/en-us/library/ms733071.aspx

因此,他可以从某个WCF安全属性派生自定义安全属性并创建自己的身份验证逻辑基于某个令牌,他很可能必须从请求的头部获取该令牌。 ServiceStack使这个超级简单,我想这不是很难使用WCF。很有可能有人已经为WCF做了这些工作,并且代码在某处。

+0

属性如何影响装饰方法的执行?这仍然需要方法代码来查询令牌检查的结果吗? –

+0

@J ... - 我的回复太长,无法发表评论,请参阅更新后的答案。 –