Простой ASP.NET на C# проектирование классов


Вот класс я разрабатываю:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.SqlClient;

namespace Artworking.classes
{

    // A group permission level
    public class PermissionGroup
    {
        public int ID;                  // Unique ID for this group
        public bool hasFullControl;     // Does this group have complete control
        public user creator;            // Who created this group
        public string groupName;        // Reference name for group

        // Constructor for when a permission group ID is passed
        public PermissionGroup(SqlConnection cn, int ID)
        {
            using (SqlCommand cmd = new SqlCommand("SELECT creatorUserID, group_name, fullControl FROM tblATPermissionGroups WHERE ID = " + ID, cn))
            {
                SqlDataReader rdr = cmd.ExecuteReader();
                if (rdr.Read())
                {
                    this.creator.ID = int.Parse(rdr["creatorUserID"].ToString());
                    this.groupName = rdr["group_name"].ToString();
                    this.hasFullControl = bool.Parse(rdr["fullControl"].ToString());
                }
                rdr.Close();
            }
        }
    }

}

Я на правильном пути? Обратите внимание, я не использую встроенную проверку подлинности как она должна быть совместима для старой системы. Что я просто проверяю, что я правильной обработки этих классов и данные загружаются правильно и т. д. Как я понимаю я должен положить мои команды SQL в классы и от реальной страницы?



1958
11
задан 24 января 2011 в 05:01 Источник Поделиться
Комментарии
4 ответа

Это вообще не хорошая идея, чтобы сделать этот тип обработки .чтор. Переместить его к нагрузке (или имя) способ. Однако это означает, что ваш объект не загружается после инстанцируют, что является еще одной проблемой. Таким образом, я бы рекомендовал отделять сущности информации (HasFullControl, Творца, группы, и т. д.) тип С тип, который загружает информацию из базы данных. Вы можете изменить PermissionGroup тип, чтобы просто иметь данные свойства, а затем переместить загрузка логики к данным слой, который отвечает за создание экземпляра загрузки данных.

Объединяя текст в конец строки SQL оставляет вас открытым для атак путем внедрения кода SQL (хотя не в данном конкретном случае). Вместо того, чтобы использовать параметр:

using (SqlCommand cmd = new SqlCommand("SELECT creatorUserID, group_name, 
fullControl FROM tblATPermissionGroups WHERE ID = @id", cn))
{
cmd.Parameters.AddWithValue("@id", id);
...
}

Вы должны обернуть объект sqldatareader в блоке using.

Использовать свойства общественного чтения, а не открытые поля.

Рассмотрите возможность использования интерфейс idbconnection , а не для sqlconnection. Это позволит вам более легко издеваться данных при тестировании этого метода и делает его легче для поддержки других РСУБД, если в этом возникнет необходимость.

Полезно бросать исключения, если что-то пойдет не так при заполнении полей данных.

Следуйте .Чистый рамках руководящих принципов именования

11
ответ дан 24 января 2011 в 06:01 Источник Поделиться

Рассмотрим в C# принятой практики. Как и другие ответы упомянули, у вас есть поля, помеченные как общедоступные. В C#, вы обычно выставляем значения как свойства и сохранить членов собственной. Начиная с C# 3, вам даже не нужно явно создавать поля членами вашей недвижимости, если геттеры и сеттеры являются нетривиальными. Поэтому рекомендуется заменить поля с

public int ID { get; private set; }
public bool HasFullControl { get; private set; }

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

Отметим также, что с практики# диктуют, что публично видны имена Паскаль обсаженных вместо корпуса верблюда. Сделать заглавной первую букву пространство имен (включая вложенные пространства имен), классов, свойств, методов и т. д.

@akmad обратилась дополнительный набор проблем, таких как конструктор, делают дорогостоящие работы и уязвимости к SQL-инъекции в общем смысле (хотя и не конкретно здесь, а akmad также упоминает). Если вам нужно сделать вызов базы данных, чтобы построить свой объект, рассмотрим заводской подход.

public class PermissionGroup
{
private PermissionGroup() { } // class cannot be constructed from outside

public static PermissionGroup GetPermissionGroup(/* your parameters */)
{
// build the object starting here!
}
}

6
ответ дан 24 января 2011 в 06:01 Источник Поделиться

Я ничего не знаю о C#, так что это просто комментарий, основанных на дизайне. Есть ли причина этих членов не частная? Почему бы вам не предоставляют средства доступа, или (как я уже говорил во многих комментариях уже на этом сайте) на самом деле двигаться в этом классе, а не подвергая каждого отдельного элемента данных? Например, это группа разрешений, есть функция под названием "isAuthorized", которому можно передать команду, чтобы выяснить, если эта группа будет позволено сделать это. Таким образом, когда вы двигаетесь вперед, вы можете сделать разрешения, возможно, более мелкозернистая и никто не должен даже знать, что потребляет этот класс.

0
ответ дан 24 января 2011 в 05:01 Источник Поделиться

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

Например, вы могли бы хотеть сделать один из членов "только чтение". Легко сделать: реализовать метод GET() объекта, но не установлен() собственность.

Аналогичным образом, ряд данных проверки могут быть легко добавлены к набору().

0
ответ дан 24 января 2011 в 05:01 Источник Поделиться