Expose方法确实被另一个类使用

时间:2013-11-03 21:01:26

标签: c# callback action

在类方法上,我有以下内容:

public class Test {
  public void SignIn() {
    var authentication = HttpContext.GetOwinContext().Authentication;
    userService.SignInUser(username, /* Expose the authentication.SignIn() method */);
  }
}

"验证"有两种方法:void SignIn()和Int32 SignOut()。

UserService类是:

public class UserService {
  public void SignInUser() {
    // Get user
    // Sign In user using HttpContext.GetOwinContext().Authentication.SignIn().
    // Log use sign in
  }
}

在SignInUser方法中,我想使用HttpContext.GetOwinContext()。Authentication.SignIn()。

但是我不想让SignInUser方法知道"关于身份验证类的任何事情。

我只需暴露要使用的SignIn方法......与Int32 SignOut相同。

我想我应该使用Action / Function / Delegate?我不知道怎么做......

我该怎么做?

谢谢你, 米格尔

1 个答案:

答案 0 :(得分:1)

我明白了!这很简单。

    public class Test
    {
        public void SignIn() {
            var authentication = HttpContext.GetOwinContext().Authentication;
            UserService.SignInUser(username, () => authentication.SignIn(), () => authentication.SignOut());
          }
    }


    public class UserService
    {
        public void SignInUser(Action onSigningIn, Func<int> onSigningOut)
        {
            // I don't check here if onSigningIn is null or not... that's all upon you
            onSigningIn();
            int n = onSigningOut();
        }
    }

这只是动作如何调用的简化形式(如果只调用一个方法):

() => authentication.SignIn()

等于:

() => { authentication.SignIn(); }

(如果你有Resharper,它甚至会建议'升级')

对于函数,您可以拥有以下内容:

() => { 
    /*some line of code*/
    /*some more line of code*/
    return "some value";
}

最后,如果要将一些值传递给Function / Action:

v => { 
    /*some line of code*/
    /*some more line of code*/
    return "some value calculated basicly on v";
}

将该Action定义为:

SignInUser (..., Action<int> onSigningIn, ...)

P.S。花一点时间来熟悉动作和功能 - 你是金色的!他

如果你熟悉javascript,那么动作和函数通常可以工作,看起来与集群类似。