2009-08-15 65 views
2

我一直沉迷于一个设计问题(臭编码有点事情)几天了。也许你可以帮忙。ASP.NET MVC:丑陋的代码需要重构(返回三个值)

我有一个“登录”法在我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. 
} 

好吧,让我上面的代码解释。该方法的主返回值(布尔值)应该告诉调用者登录请求是否成功。现在,如果成功,我需要将用户重定向到不同的Url(因此,“out”参数successRedirectUrl)。如果不成功,我需要在视图中告诉用户哪里出了问题 - 因此是ValidationDictionary(ModelState)。

这段代码虽然很难看,但很难维护。我想摆脱布尔返回类型(直接返回successRedirectUrl并检查调用者方是否为空),但我觉得事情变得更加不清楚。

任何想法如何更好地做到这一点?

谢谢!

+1

我真的认为你的意思是:s /繁殖/育雏。繁殖完全是另一回事;)。事实上,你已经为你解决了这个问题。 – 2009-08-15 20:03:25

+0

哈哈你说得对,谢谢Joel :) – Alex 2009-08-16 06:55:39

回答

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 
} 
+0

你可以通过在另一种方法中重构该部分来处理字典内容。将会更可测试 – Perpetualcoder 2009-08-15 20:32:32

9

制作一个自定义类来保存所有三个值,并将其返回。摆脱“out”参数。

+0

这就是面向对象编程的全部内容。 – DOK 2009-08-15 20:04:16

1

问题:

是重定向URL不同用户的不同? - 我想说它不应该是,但如果它不同,决定不应该在你的业务层。这是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; 
} 
+0

是的,不同用户的重定向URL是不同的。 – Alex 2009-08-16 06:57:37