ASP.NET MVC:丑陋的代码需要重构(返回三个值)

时间:2009-08-15 19:57:33

标签: c# asp.net-mvc refactoring

我已经沉溺于一个设计问题(有点臭的代码),现在已经好几天了。也许你可以提供帮助。

我的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并检查调用方是否为空)但我觉得事情变得更加不清楚。

知道怎么做得更好吗?

谢谢!

3 个答案:

答案 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;
}