2012-03-27 3 views
0

Мне нужна функция входа (логин - это всего лишь пример, любой другой часто используемый метод может быть точным), который берет адрес электронной почты и пароль как параметр и запрашивает DB, если есть такой пользователь. Если да, он должен вернуть customer_id (int), если нет, он вернет сообщение, почему логин не может произойти (например: нет такого адреса электронной почты).Повторное использование общих функций с наилучшим правильным подходом C#

Я также не хочу переписывать функцию входа в систему каждый раз. Я хочу написать его один раз в общем проекте, который я могу использовать в каждом проекте и использовать его повторно. Но я пытаюсь найти наилучшую практику для этого. До сих пор я думал о чем-то вроде ниже, но проблема для меня в том, что я не могу вернуть идентификатор клиента, который я получу в кодах в моих проектах (любой другой проект) и открою с ним переменную сеанса. Я могу возвращать строки ниже структуры. Я также подумал о возвращении Dic, но это также неправильно. Я думаю, потому что, если bool (key) оказывается истинным, CustomerID не является строкой (значением). Можете ли вы мне помочь, изучив правильный способ использования общих функций, не задумываясь о возвращении сообщений и переменных дважды? Большое спасибо

public class UserFunctions 
{ 
    private enum Info 
    { 
     //thought of returning codes?? 
     LoginSuccess = 401, 
     NoMatchPasswordEmail = 402, 
     InvalidEmail = 403,    
    }; 

    public string TryLogin(string email, string password) 
    { 
     bool isValidEmail = Validation.ValidEmail(email); 
     if (isValidEmail == false) 
     {     
      return Result(Info.InvalidEmail); 
      // returning a message here 
     }   

     Customers customer = new Customers(); 
     customer.email = email; 
     customer.password = password; 
     DataTable dtCustomer = customer.SelectExisting(); 

     if (dtCustomer.Rows.Count > 0) 
     {     
      int customerID = int.Parse(dtCustomer.Rows[0]["CustomerID"].ToString());     
      return Result(Info.LoginSuccess); 
      // Here I cant return the customerID. I dont wanna open a session here because this function has no such a job. Its other projects button events job I guess 
     } 
     else 
     {     
      return Result(Info.NoMatchPasswordEmail); 
     } 
    } 

    private string Result(Info input) 
    { 
     switch (input) 
     { 
      case Info.NoMatchPasswordEmail: 
       return "Email ve şifre bilgisi uyuşmamaktadır"; 
      case Info.InvalidEmail: 
       return "Geçerli bir email adresi girmelisiniz"; 
      case Info.LoginSuccess: 
       return "Başarılı Login"; 
     } 

     return ""; 
    } 
} 

ответ

0

Вы можете попробовать Создать событие, а затем код вызова может зарегистрироваться на мероприятие перед попыткой входа в систему. Например:

public class UserFunctions 
{ 
    private enum Info 
    { 
     LoginSuccess = 401, 
     NoMatchPasswordEmail = 402, 
     InvalidEmail = 403,    
    }; 

    public delegate void LoginAttemptArgs(object sender, Info result, int CustomerID);//Define the delegate paramters to pass to the objects registered to the event. 
    public event LoginAttemptArgs LoginAttempt;//The event name and what delegate to use. 

    public void TryLogin(string email, string password) 
    { 
     bool isValidEmail = Validation.ValidEmail(email); 
     if (isValidEmail == false) 
     {     
      OnLoginAttempt(Info.InvalidEmail, -1); 
     }   

     Customers customer = new Customers(); 
     customer.email = email; 
     customer.password = password; 
     DataTable dtCustomer = customer.SelectExisting(); 

     if (dtCustomer.Rows.Count > 0) 
     {     
      int customerID = int.Parse(dtCustomer.Rows[0]["CustomerID"].ToString()); 
      OnLoginAttempt(Info.LoginSuccess, customerID); 
     } 
     else 
     {      
      OnLoginAttempt(Info.NoMatchPasswordEmail, -1); 
     } 
    } 
    private void OnLoginAttempt(Info info, int CustomerID) 
    { 
     if (LoginAttempt != null)//If something has registered to this event 
      LoginAttempt(this, info, CustomerID); 
    } 
} 

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

Edit: Опечатки и я пропустил вызов события ... .Twice

1

Вы можете рассмотреть вопрос о возвращении экземпляра пользовательского класса.

public class LoginResult 
{ 
    public Info Result { get; set; } 
    public int CustomerId { get; set;} 
} 

Измените метод TryLogin, чтобы вернуть экземпляр LoginResult.

Base ваш поток приложения на результат:

var loginResult = TryLogin(..., ...); 

switch (loginResult.Result) 
{ 
    case Info.LoginSuccess: 
     var customerId = loginResult.CustomerId; 
     //do your duty 
     break; 
    case Info.NoMatchPasswordEmail: 
     //Yell at them 
     break; 
    ... 
} 
+0

Совсем забыл об этом варианте. Думаю, я тоже слишком много думал о коробке. – Skintkingle

+0

Тогда для каждой функциональной группы вам придется написать собственный класс. Например, вам нужен общий класс операций с корзинами и функция добавления в корзину. На этот раз вам придется написать собственный класс с идентификатором orderID. –

+0

То, что мне кажется совсем другой функцией, и поэтому для этого потребуется больше кода. Выше приведен пример общего «входа», он должен быть отделен от «ордеров». Исследование SOP, Разделение проблем для получения дополнительной информации. – Khan

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