Повторное использование общих функций с наилучшим правильным подходом c # - PullRequest
0 голосов
/ 28 марта 2012

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

Я также не хочу переписывать функцию входа каждый раз. Я хочу написать это один раз в общем проекте, который я могу использовать в каждом своем проекте и использовать его повторно. Но я пытаюсь найти лучшую практику для этого. До сих пор я думал что-то вроде ниже, но проблема для меня заключается в том, что я не могу вернуть customerID, который я получу в codebehind в моих проектах (любом другом проекте), и открыть с ним переменную сеанса. Я могу только вернуть строки в структуре ниже. Я также подумал о возврате Dic, но это также неправильно, я думаю, потому что, если bool (key) имеет значение true, 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 "";
    }
}

Ответы [ 2 ]

1 голос
/ 28 марта 2012

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

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

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

Основывайте поток ваших приложений на результате:

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 голосов
/ 28 марта 2012

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

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);
    }
}

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

Редактировать: опечатки, и я пропустил вызов события .... Дважды

...