2009-08-15 2 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. 
} 

Хорошо, позвольте мне объяснить выше кода. Основное возвращаемое значение метода (Boolean) должно указывать вызывающему, был ли успешный запрос на вход. Теперь, если это было успешно, мне нужно перенаправить пользователя на другой Url (таким образом, параметр «out» successRedirectUrl). Если он НЕ был успешным, мне нужно сообщить пользователю, что было не так - таким образом, ValidationDictionary (Modelstate).

Этот код действительно уродливый и трудноудерживающий. Я подумал о том, чтобы избавиться от типа возвращаемого типа Boolean (сразу возвращая SuccessRedirectUrl и проверяя сторону вызывающего, если он пуст), но я почувствовал, что все стало еще более неясным.

Любая идея, как это сделать лучше?

Спасибо!

+1

Я действительно думаю, что вы имеете в виду: s/разведение/задумчивость. Разведение - это совсем другое;). На самом деле, ты его исправил. –

+0

Ха-ха, вы правы, спасибо Joel :) – Alex

ответ

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

9

Создайте собственный класс для хранения всех трех значений и верните его. Избавьтесь от параметров «out».

+0

Это объектно-ориентированное программирование. – DOK

1

Вопросы:

Является ли редирект URL различны для разных пользователей? - Я бы сказал, что этого не должно быть, но если это другое, решение не должно быть в вашем бизнес-слое. Это логика пользовательского интерфейса и должна быть там.

Какой у вас интерфейс 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() не должен быть поиск в базе данных или что-нибудь еще сложнее. Опять же, это должна быть простая логика пользовательского интерфейса, что-то вроде:

public string GetUserPage(string user) 
{ 
    return "/MyPage/" + user; 
} 
+0

Да, URL-адрес перенаправления для разных пользователей различен. – Alex

Смежные вопросы