在类方法上,我有以下内容:
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?我不知道怎么做......
我该怎么做?
谢谢你, 米格尔
答案 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,那么动作和函数通常可以工作,看起来与集群类似。