3-слой приложения ASP.NET - нужна критика/советы


Мои текущие настройки-это 3 многоуровневых приложений: интерфейс > БЛЛ > дал. Каждый слой создан как отдельный проект. Пользовательский интерфейс веб-сайта ASP.NET и БЛЛ & даль проекты библиотеки классов.

Я показал некоторые примеры кода из каждого слоя. Надеюсь, вы, ребята, можете критиковать мой дизайн приложения и дать мне некоторые советы/указатели или я делаю это неправильно, направить меня в правильном направлении. Спасибо!

Дал способ:

public static object Get_UserId(string username)
{
    ConnectionSettings connectionSettings = new ConnectionSettings();
    SqlConnection sqlConnection = new SqlConnection(connectionSettings.ConnectionString);
    string sql = String.Format("select UserId from Users where Username = '{0}'", username);
    try
    {
        sqlConnection.Open();
        SqlCommand sqlCommand = new SqlCommand(sql, sqlConnection);
        return sqlCommand.ExecuteScalar();
    }
    catch
    {                
        throw new DALException("Unable to retreive User ID");
    }
    finally
    {
        sqlConnection.Close();
    }
}

В БЛЛ методе при получении ID пользователя:

 public static int GetUserId(string username)
 {
     try
     {
         int userId = Int32.Parse(UserDAL.Get_UserId(username).ToString());
         return userId;
     }
     catch (Exception ex)
     {
         throw new BLLException(ex.Message);
     }
 }

Вызов БЛЛ от пользовательского интерфейса:

try
{
    int id = UserBLL.GetUserId("bobloblaw");
    Response.Write(id);
}
catch (DALException dalEx)
{
    Response.Write(dalEx.Message);
}
catch (BLLException bllEx)
{
    Response.Write(bllEx.Message);
}


1448
7
задан 6 июля 2011 в 05:07 Источник Поделиться
Комментарии
3 ответа

Вещи, которые я хотел изменить в коде/подход:


  • лог ошибок

  • избавиться от статических методов обслуживания

  • скрытие ДЛЛ исключения в пользовательском интерфейсе. Поймать его в bll и журнала это/что-то с ней.

  • менять DLL, таким образом, в БЛЛ вместо:

инт id_пользователя = int32 значение.Разобрать(UserDAL.Get_UserId(имя пользователя).Метод toString());

бы использовать:

int идентификатор пользователя = новый UserDAL().Get_UserId(имя пользователя);

Это первые вещи, которые приходят мне в голову.

2
ответ дан 7 июля 2011 в 05:07 Источник Поделиться

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

Однако мой главный сцепления заключается в том, что вы не используете параметризованные запросы. Этот код:

string sql = String.Format("select UserId from Users where Username = '{0}'", username);

Должно быть:

string sql = @"select UserId from Users where Username = @username");
SqlCommand sqlCommand = new SqlCommand(sql, sqlConnection);
sqlCommand.Parameters.AddWithValue("@username", username);

Это может уменьшить ваш SQL-инъекций проблему, используя строку.Формат(...). Я делаю это в привычку всегда использовать параметризованные запросы, независимо от того, передаются данные из ввода данных или нет. Просто нет причин не делать этого.

Также на месте, используя , наконец, сворачиваться в использовании заявление, чтобы закрыть и выбросить данные предметы, как команда sqlcommand и sqlconnection для.

2
ответ дан 6 августа 2011 в 03:08 Источник Поделиться


  1. Я согласен с IAmDeveloper , что БЛЛ метод должен быть:

    int userId = new UserDAL().Get_UserId(username);

  2. Я согласен с Тимом метров , что вы должны использовать параметризованные запросы.

  3. Я бы изменил весь подход к обработке исключений:


    • Это неправильно, чтобы поймать все исключения в даль.Get_UserId и заменить их DALException. Поступая так, вы потеряете всю информацию об исходном исключении, таких как трассировка стека, и только оставить сообщение (что само по себе может быть иногда довольно бесполезно). Вместо этого, создать изменить BLLException конструктора, чтобы принять внутреннее исключение:

      public BLLException (string message, Exception inner)
      : base (message, inner) { }

      и бросить его таким образом:

      throw new BLLException ("Error getting user ID", ex);

      Внутреннее исключение тогда будет доступна через свойство innerexception свойство.


    • Вы пытаетесь поймать DALException в пользовательском интерфейсе слоя, но это никогда не происходит потому, что бизнес-слой уже заменяет их BLLExceptionС.


1
ответ дан 6 августа 2011 в 08:08 Источник Поделиться