Отделение пользовательского интерфейса от доступа к данным в пользовательском элементе управления ascx - PullRequest
2 голосов
/ 23 декабря 2009

Какова «лучшая практика» для разработки пользовательских элементов управления ascx в отношении отделения пользовательского интерфейса от доступа к данным? Должен ли мой пользовательский элемент управления использовать трехуровневую архитектуру, как в моих проектах, или я могу выполнять доступ к данным из пользовательского элемента управления?

Ответы [ 5 ]

2 голосов
/ 23 декабря 2009

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

Эта ссылка может вам помочь:

http://www.simple -talk.com / DotNet / .net-рамка / .net-приложения архитектура-данные уровень доступа /

1 голос
/ 23 декабря 2009

Теперь независимо от того, насколько простой или сложный проект, по крайней мере, все должно быть разделено на уровень представления, бизнес-уровень и уровень данных. В любой момент времени любой из трех может измениться, не затрагивая других.

Пользовательский элемент управления является частью уровня представления, он должен предоставлять данные и пользовательские действия бизнес-уровню, который, в свою очередь, интерпретирует данные и эти действия для принятия решений. При необходимости бизнес-уровень вызывает уровень данных. Уровень данных, в свою очередь, будет обрабатывать все взаимодействия с базой данных / исходными файлами.

Это не так сложно разделить три и держать их отдельно.

0 голосов
/ 23 декабря 2009

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

0 голосов
/ 23 декабря 2009

Это то, что у меня есть в моем проекте.

1.) Application.Infrastructure

  • Базовые классы для всех бизнес-объектов, коллекции бизнес-объектов, классы доступа к данным и мои пользовательские атрибуты и утилиты в качестве методов расширения, общая структура проверки. Это определяет общую организацию поведения моего окончательного приложения .net.

2.) Application.DataModel

  • Типизированный набор данных для базы данных.
  • Адаптеры таблиц расширены для включения транзакций и других функций, которые могут мне понадобиться.

3.) Application.DataAccess

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

4.) Application.DomainObjects

  • Бизнес-объекты и коллекции бизнес-объектов.
  • Перечисления.

5.) Application.BusinessLayer

  • Предоставляет классы менеджера, доступные на уровне презентации.
  • HttpHandlers.
  • Базовый класс моей собственной страницы.
  • Здесь все больше и больше ..

6.) Application.WebClient или Application.WindowsClient

  • Мой уровень презентации
  • Принимает ссылки из Application.BusinessLayer и Application.BusinessObjects.

Application.BusinessObjects используются во всем приложении и перемещаются по всем уровням, когда это необходимо [кроме Application.DataModel и Application.Infrastructure]

Все мои запросы определяются только Application.DataModel.

Application.DataAccess возвращает или принимает бизнес-объекты как часть любой операции доступа к данным. Бизнес-объекты создаются с помощью атрибутов отражения. Каждый бизнес-объект помечается сопоставлением атрибутов с целевой таблицей в базе данных, а свойства внутри бизнес-объекта помечаются сопоставлением атрибутов с целевым столбцом в соответствующей таблице базы данных.

Моя структура проверки позволяет мне проверять каждое поле с помощью назначенного атрибута Validation.

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

Пример бизнес-объекта будет выглядеть в моем приложении следующим образом.

User.cs

[TableMapping("Users")]
public class User : EntityBase
{
    #region Constructor(s)
    public AppUser()
    {
        BookCollection = new BookCollection();
    }
    #endregion

    #region Properties

    #region Default Properties - Direct Field Mapping using DataFieldMappingAttribute

    private System.Int32 _UserId;

    private System.String _FirstName;
    private System.String _LastName;
    private System.String _UserName;
    private System.Boolean _IsActive;

    [DataFieldMapping("UserID")]
    [DataObjectFieldAttribute(true, true, false)]
    [NotNullOrEmpty(Message = "UserID From Users Table Is Required.")]
    public override int Id
    {
        get
        {
            return _UserId;
        }
        set
        {
            _UserId = value;
        }
    }

    [DataFieldMapping("UserName")]
    [Searchable]
    [NotNullOrEmpty(Message = "Username Is Required.")]
    public string UserName
    {
        get
        {
            return _UserName;
        }
        set
        {
            _UserName = value;
        }
    }

    [DataFieldMapping("FirstName")]
    [Searchable]
    public string FirstName
    {
        get
        {
            return _FirstName;
        }
        set
        {
            _FirstName = value;
        }
    }

    [DataFieldMapping("LastName")]
    [Searchable]
    public string LastName
    {
        get
        {
            return _LastName;
        }
        set
        {
            _LastName = value;
        }
    }

    [DataFieldMapping("IsActive")]
    public bool IsActive
    {
        get
        {
            return _IsActive;
        }
        set
        {
            _IsActive = value;
        }
    }

    #region One-To-Many Mappings
    public BookCollection Books { get; set; }

    #endregion

    #region Derived Properties
    public string FullName { get { return this.FirstName + " " + this.LastName; } }

    #endregion

    #endregion

    public override bool Validate()
    {
        bool baseValid = base.Validate();
        bool localValid = Books.Validate();
        return baseValid && localValid;
    }
}

BookCollection.cs

/// <summary>
/// The BookCollection class is designed to work with lists of instances of Book.
/// </summary>
public class BookCollection : EntityCollectionBase<Book>
{
    /// <summary>
    /// Initializes a new instance of the BookCollection class.
    /// </summary>
    public BookCollection()
    {
    }

    /// <summary>
    /// Initializes a new instance of the BookCollection class.
    /// </summary>
    public BookCollection (IList<Book> initialList)
        : base(initialList)
    {
    }
}
0 голосов
/ 23 декабря 2009

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

  • Что если ваши правила доступа изменились?
  • Что если ваше хранилище изменилось?
  • Можете ли вы убедиться, что каждый элемент управления пользовательского интерфейса может применять бизнес-правила?
  • и т.д.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...