MVVM с WPF использование LINQtoSQL в DAL наряду с BLL

Моя цель состоит в том, чтобы иметь приложение, которое использует WPF и является 3 архитектурой уровня. UI, BLL и DAL... Я хотел бы использовать MVVM, но я не уверен, как это работает с 3 архитектурой уровня или если это - что-то совершенно различное. Таким образом, имея это в виду, у меня есть несколько вопросов:

1) LINQtoSQL: я считал много онлайн, что говорят, что LINQ заменяет Ваш DAL и замеченный много статей, в которых говорится это плохая идея. Я думаю, что это - плохая идея, однако, что я вставляю здесь? Каковы типы данных, которые я возвращаю BLL? IQueryable? ObservableCollection? У меня нет подсказки.

2) BLL: я хотел бы сделать это сервисом, который работает на сервере, так, чтобы, когда я должен внести изменение, я не должен был повторно развертывать целое приложение, я просто должен перезапустить сервис. Но, я не уверен, где запустить на этом.

3) С BLL я предполагаю, что смущен о том, как данные проходят все слои от DAL полностью к Интерфейсу.

Я провел большое исследование онлайн и имею остатки вещей, однако я не видел, что любой говорит о приложении WPF, которое использует MVVM с LINQ в DAL с помощью SQLMetal и BLL, это работает на сервере. Кто-либо может указать на меня в правильном направлении? или возможно книга для получения?

7
задан ThinkingStiff 4 August 2012 в 18:54
поделиться

4 ответа

Майк,

ваш вопрос действительно классный, мне он нравится. Во-первых, не стесняйтесь немного поэкспериментировать - каждый проект индивидуален, поэтому нет единого правила, которое подходило бы для всех. Вот почему я предлагаю просто оставить DAL для LINQ 2 SQL. этот отличный инструмент справится с этим, вам не о чем беспокоиться. Во-вторых, вы упомянули трехуровневую архитектуру, но почему для модели нет места? Поскольку все модели генерируются автоматически (например, SQLMetal), вам также не нужно беспокоиться о сопоставлениях. Итак, если вам еще не скучно, позвольте мне ответить на все ваши 3 вопроса:

  1. Пропустите DAL и внимательно наблюдайте за своим проектом - если вы чувствуете, что ему не хватает этого уровня - добавьте его (он будет содержать запросы LINQ2SQL ). И вторая часть - вы можете вернуть все, что захотите, но вам будет удобнее всего использовать IEnumerable <> или IQueryable <>, параметризованные с вашими моделями.

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

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

Контракт / Интерфейс:

IEnumerable<User> GetTallUsersOver40();
IEnumerable<User> GetShortUsersOver60();
...

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

Я хочу использовать MVVM, что теперь? Ответ проще, чем вы думаете - просто подготовьте свои представления и модели просмотра и просто используйте свою реализацию контракта / интерфейса BLL.

Спрашивайте, если у вас есть дополнительные вопросы!

2
ответ дан 7 December 2019 в 14:32
поделиться

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

  1. LINQ to SQL на самом деле довольно хорош в том, что он должен делать, а именно в замене вашего DAL. Но не возвращайте IQueriable вверх в ваш BLL, так как это позволит (или, по крайней мере, намекнуть на возможность) BLL напрямую запрашивать вашу БД. Вы должны передать объект данных в BLL и позволить ему построить соответствующий бизнес-объект. Также обратите внимание: LINQ сам по себе может использоваться на любом уровне (и фактически является одной из лучших функций C #). LINQ to SQL - это механизм, с помощью которого операторы LINQ преобразуются в запросы SQL.

  2. BLL как услуга - естественный выбор. Обеспечьте восходящий интерфейс к уровню представления (служба WCF здесь - хороший вариант).

  3. BLL генерирует бизнес-объекты на основе данных, полученных от DAL. Чтобы обеспечить хорошее разделение слоев, вы должны использовать разные классы для ваших объектов DAL и BLL. Не создавайте зависимости между уровнем представления и уровнем данных.

2
ответ дан 7 December 2019 в 14:32
поделиться

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

  1. LINQ2SQL крутой, но может стать громоздким из-за дизайнеров VS08. Взгляните на http://plinqo.com/ , чтобы использовать его с CodeSmith для генерации DAL, и я думаю, что он также будет выполнять BLL с контрактами. Другой вариант генерации - Oleg Sych T4 templates Одна проблема, с которой мы столкнулись с LINQ2SQL, - это особый текст данных. Если вам не нужно быть модульным, это не проблема.

  2. Я согласен с тем, что другие говорили о контрактах данных, и смотрю, что может сгенерировать Plinqo. Это может сэкономить вам много времени.

  3. Обычно данные перемещаются вверх по объектам. Как говорили другие, убедитесь, что вы сохраняете видимость между всеми слоями, чтобы у вас не было зависимостей.

Когда вы дойдете до части MVVM, вы откроете совершенно новую банку червей. Я не думаю, что по MVVM выпущено много или вообще каких-либо книг. Это все еще несколько новое увлечение.

0
ответ дан 7 December 2019 в 14:32
поделиться

Отличный вопрос, я нахожусь на детских склонах кривой обучения WCF / WPF, поэтому я нахожусь в том же положении, что и вы. Мои 2 цента:

  1. Я не разбирался в Linq to SQL, я старая школа и привыкла писать хранимые процедуры и представления. В настоящее время я использую их для заполнения классов DTO, то есть классов без методов, просто свойств для представления данных. Я знаю, что я, вероятно, отстал от этого.

  2. Сделайте свой BLL службой WCF - поместите контракт (ы) службы и контракт (ы) данных в их собственную сборку, затем вы можете включить их в свой клиент, где они станут вашей моделью или его частью.

  3. Включите в клиентское приложение ссылку на сборку, содержащую контракты на службы и контракты данных. Контракты данных затем становятся вашей моделью, ваши ViewModels могут обернуть эти модели и раскрыть их свойства (реализовать INotifyPropertyChanged для привязки данных).

Я использую книги О'Рейли «Программирование служб WCF», «Изучение служб WCF» и «Программирование WPF», которые мне очень нравятся. Я не знаю ни одной конкретной книги о MVVM, но в сети есть масса материала.

0
ответ дан 7 December 2019 в 14:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: