1

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

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

“身份验证”有 2 种方法:void SignIn() 和 Int32 SignOut()。

用户服务类是:

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 方法“知道”任何关于 Authentication 类的信息。

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

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

我怎样才能做到这一点?

谢谢你,米格尔

4

1 回答 1

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";
}

最后,如果您将一些值传递给函数/动作:

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

该动作的定义为:

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

PS 只需花一点时间来熟悉动作和函数——你就是金子!呵呵

如果您熟悉 javascript,那么 Actions 和 Functions 通常可以工作并且看起来类似于 clusures。

于 2013-11-03T21:37:27.760 回答