我已经沉溺于一个设计问题(有点臭的代码),现在已经好几天了。也许你可以提供帮助。
我的RegistrationService中有一个“登录”方法,目前看起来简化如下:
public Boolean Login(String username, String password,
out String successRedirectUrl,
out IValidationDictionary validationResults)
{
successRedirectUrl = "";
if (!Validator.IsValid(username) || !Validator.IsValid(password)) return false;
// Other logic
// Distributed login requests etc.
// Build Redirect Url if login was successful etc.
}
public Boolean Login(String username, String password,
out String successRedirectUrl,
out IValidationDictionary validationResults)
{
successRedirectUrl = "";
if (!Validator.IsValid(username) || !Validator.IsValid(password)) return false;
// Other logic
// Distributed login requests etc.
// Build Redirect Url if login was successful etc.
}
好的,让我解释一下上面的代码。该方法的主返回值(布尔值)应该告诉调用者登录请求是否成功。现在,如果它成功,我需要将用户重定向到另一个Url(因此,“out”参数successRedirectUrl)。如果它不成功,我需要在视图中告诉用户有什么问题 - 因此ValidationDictionary(Modelstate)。
这段代码非常难看,但很难维护。我想摆脱布尔返回类型(直接返回successRedirectUrl并检查调用方是否为空)但我觉得事情变得更加不清楚。
知道怎么做得更好吗?
谢谢!
答案 0 :(得分:9)
创建一个自定义类来保存所有三个值,然后返回它。摆脱“出局”参数。
答案 1 :(得分:3)
这个怎么样?
public class LoginOutput{
private bool _isLoginSuccess=false;
public bool IsLoginSuccess{/*Usual get set block*/}
private string _successRedirectUrl = String.Empty();
public string SuccessRedirectUrl{/*Usual get set block*/}
public IValidationDictionary ValidationResultDict{/*Usual get set block*/}
}
//your method now could be
public LoginOutput Login(string username, string password){
// your logic goes here
}
答案 2 :(得分:1)
问题:
不同用户的重定向网址是否不同? - 我会说它不应该,但如果不同,决定不应该在你的业务层。这是UI逻辑,应该在那里。
你的IValidationDictionary界面是什么?您可以直接在UI逻辑中使用它:
public IValidationDictionary Login(string user, string password);
var user = "bob";
var validator = Login(user, "password");
if (validator.IsValid)
Response.Redirect(GetUserPage(user));
else
HandleLoginError();
请注意,GetUserPage()不应该是数据库查找或其他任何复杂的。同样,这应该是简单的UI逻辑,例如:
public string GetUserPage(string user)
{
return "/MyPage/" + user;
}