Лучшие практики для привязки данных в asp.net для удобства обслуживания - PullRequest
7 голосов
/ 17 февраля 2009

Я хотел бы знать, каковы наилучшие практики использования asp.net DataBinding с точки зрения удобства сопровождения.

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

Должен ли я полностью связать данные в codebehind? Я планирую использовать ObjectDataSources для привязки данных. Есть ли что-то, что легче поддерживать, чем использовать привязку данных, если да, то что это?

Есть ли какие-то соображения, которые я должен учитывать при разработке уровня доступа к данным и уровня бизнеса?

Спасибо.

Ответы [ 3 ]

4 голосов
/ 17 февраля 2009

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

2 голосов
/ 17 февраля 2009

Хороший вопрос!

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

Во-первых, я всегда создаю (или использую, в основном) Уровень доступа к данным (DAL), чтобы упростить доступ к данным. Это , а не , потому что я могу когда-нибудь поменять вашу базу данных на другую - шансы на нее достаточно малы, чтобы она не гарантировала всю работу, которая потребуется (YAGNI). Вы делаете это так, чтобы вы могли: а) удалить весь беспорядок из обычного кода базы данных (например, получить строку соединения, установить и закрыть соединения и т. Д.) И б) упростить общие операции с выделенными функциями.

Во-вторых, вы абсолютно должны реализовать ObjectDataSources, которые инкапсулируют DataBinding для ваших элементов управления пользовательского интерфейса. Если вы создали хороший DAL, это становится довольно тривиальным. Например, вот ObjectDataSource, который использует мой DAL:

    [DataObjectMethodAttribute(DataObjectMethodType.Select, true)]
    public List<EnrollListMemberData> GetNameList(int classID, DateTime classDate)
    {
        using (BSDIQuery qry = new BSDIQuery())
        {
            return
                qry.Command(
                    "Select a.ClassDate, a.ClientID, b.FirstName, b.LastName, b.ID From ClassEnroll a inner join Folder b on (a.ClientID = b.ClientID) Where (a.ClassID=@ClassID) AND ")
                    .ParamVal(classID)
                    .Append("(DateDiff(d, a.ClassDate, @ClassDate) = 0) Order By LastName;")
                    .ParamVal(classDate)
                    .ReturnList<EnrollListMemberData>();
        }
    }

Несколько вещей, на которые следует обратить внимание: атрибут «DataObjectMethodAttribute» сделает этот метод видимым для среды времени разработки, так что вы увидите его в раскрывающемся списке источников данных при переходе по ссылке на свою таблицу ( или что угодно). Вам также понадобится атрибут [DataObjectAttribute] в классе, который предоставляет этот метод (этот класс, если он является частью моего бизнес-уровня). Наконец, это довольно простой пример, и он не имеет общих конструкций, таких как параметры startRowIndex и maximumRows для возврата постраничных результатов.

Обратите внимание, что конкретный вызов здесь сделан из моего DAL - это не LinqToSQL, хотя он имеет поверхностное сходство. Мне нравится SQL, и я не хочу идиомы C #, которые просто имеют произвольное отображение обратно в SQL в любом случае . Обратите внимание, что если бы я попытался реализовать все это в прямых вызовах ADO, эта функция была бы в три раза длиннее и содержала бы много кода, который на самом деле не был бы уместным для выражения моих целей.

В-третьих, я всегда помещаю операции многоэтапной базы данных в хранимые процедуры, чтобы минимизировать количество вызовов по проводам в базу данных. Например, я предоставляю функцию «Регистрация» в одном продукте, которая принимает запрос на регистрацию, проверяет его по таблице членства, извлекает предыдущую проверку в истории (сколько посещений за последний месяц?), Присуждает поощрительные баллы, если это необходимо, и т. д. и т. д. Выполнение нескольких запросов и изменений в базе данных в коде C # было бы ужасно сложным и довольно дорогим. В соответствии с нашей философией DAL, я также инкапсулирую вызов хранимой процедуры в моем DAL, так что фактический вызов из кода просто:

int status = dal.CheckIn (ИД пользователя, ref checkInHistory);

Как видите, использование хранимой процедуры и ее инкапсуляция в методе класса C # также облегчает чтение кода far . Мой код просто говорит о том, что он делает (как указано выше), вместо того, чтобы иметь более 100 строк кода для настройки запросов и т. Д.

Надеюсь, это поможет!

0 голосов
/ 10 марта 2009

Просто для полноты картины я хочу добавить это о своем комментарии в первом ответе.

Я задал следующий вопрос:

если вы связываете данные из кода, вы все равно придется определять ваши поля в разметке. Как бы вы сделали уверен, что изменения в вашем бизнесе объекты не будут ломать страницы?

При привязке данных, если вы приведете свой объект, он будет обнаружен во время компиляции, если имя свойства изменилось или оно больше не существует.

Exemple:

<%# ((ObjetType)Container.DataItem).PropertyName %>

Кроме того, это позволит избежать использования Eval, который, как сообщается, работает медленно, поскольку использует отражение. (Сам не проверял влияние на производительность)

...