Как правильно отделить операции базы данных от gui / logic в c # при работе с источниками данных? - PullRequest
4 голосов
/ 11 января 2010

Мне очень трудно понять, как определить хороший поисковый термин для моей проблемы: разделение взаимодействия между графическим интерфейсом и базой данных в Visual Studio 2008 с использованием Linq для sql.

По словам моего учителя в классе c #, неправильно, когда графический интерфейс зависит от конкретного способа получения данных.

В настоящее время мой проект настроен так, что у нас есть база данных mssql, где все хранится. Решение разделено на 4 отдельных проекта. UserGUI, AdminGUI, Logic и Db.

Теперь, используя linq для заполнения списков и тому подобных вещей, я использую что-то вроде:

Из оконной формы в проекте UserGUI:

//The activeReservationBindingSource has Db.ActiveReservation as it's value
private void refreshReservation() {
            activeReservationBindingSource.DataSource = logic.getActiveReservationsQry();
        }

К проекту Логика:

public IQueryable getActiveReservationsQry() {
    return dbOperations.getActiveReservationsQry(this.currentMemberId);
}

К проекту базы данных:

public IQueryable getActiveReservationsQry(int memberId) {
            var qry =
             from active in db.ActiveReservations
             where active.memberId == memberId
             orderby active.reservationId
             select active;

            return qry;
        }

Это имеет смысл для меня, потому что я могу отправлять элементы из списков в проект базы данных и легко обновлять / вставлять их в базу данных mssql. Проблема в том, что было бы довольно сложно объединиться с базой данных mssql, скажем, для версии доступа.

Что я должен читать, чтобы понять, как это сделать правильно? Является ли создание собственных классов с теми же значениями, которые генерирует Visual Studio для меня, когда я создаю файл dbml, подходящим способом? Должен ли я тогда в проекте логики заполнить, например, List, который я передаю в GUI? Для меня это звучит как «двойная работа», но, возможно, это правильный путь?

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

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

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

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

Ответы [ 5 ]

2 голосов
/ 11 января 2010

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

Привет

0 голосов
/ 11 января 2010

Может быть, вы можете взглянуть на Аннотация данных

0 голосов
/ 11 января 2010

По словам моего учителя в классе c #, это неправильно, если графический интерфейс пользователя зависит от конкретного способа получения данных.

Честно говоря, твой учитель идиот. Это одно из самых глупых утверждений, с точки зрения базы данных, которое я когда-либо читал. Конечно, вы хотите зависеть от конкретного способа получения данных, если это наиболее эффективный способ получения данных (который почти всегда зависит от базы данных и подразумевает не использование LINQ to SQL для сложных запросов, но это другой вопрос, который выдает). Пользователи заботятся о производительности, а не о независимости базы данных.

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

И поскольку каждая база данных реализует SQl по-разному, даже использование ANSII sql не является полностью независимым от базы данных. В частности, доступ не близко к стандарту ANSII. Невозможно написать код, который будет корректно работать с каждой возможной базой данных.

0 голосов
/ 11 января 2010

Одно ключевое слово для чтения: Model-View-Controller. Это вроде идеи, которую вы ищете. Ваш «Вид» - это графический интерфейс. «Модель» - это уровень данных, а контроллер - это код, который берет данные из БД и передает их в графический интерфейс (и наоборот).

0 голосов
/ 11 января 2010

Проверьте шаблон хранилища. Есть несколько реализаций, которые вы можете найти, прибегая к помощи "Linq repository."

вы можете проверить серию MVC Storefront здесь: http://www.asp.net/learn/mvc-videos/#MVCStorefrontStarterKit. В этой серии Роб Конери создает репозиторий Linq IQueryable, который возвращает объекты, созданные пользователем, а не объекты linq.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...