Entity Framework POCO Entities в многослойном веб-приложении - PullRequest
9 голосов
/ 22 июля 2010

Я новичок в EF4 и не имел опыта работы с ним раньше. Так что терпите меня, если это очень простой вопрос. У меня есть объекты POCO (файл .tt) в BOL, файл .edmx (EDM) в DAL и мое веб-приложение в слое Presentation. Вся бизнес-логика переходит на уровень BLL. Вот ссылки:

UI -> BLL-DAL-BOL
BLL -> DAL-BOL
DAL -> BOL
BOL -> Ни один из моих проектов.

1- Верно ли мое понимание различия слоев? Я в правильном направлении? 2- Как я могу использовать ASP.NET Membership провайдера с сущностями. Должен ли я реализовать членство, постоянное невежество и сопоставить все пользовательские таблицы на сервере SQL с сущностями?

2- Как добавить пользовательскую проверку? Я не имею в виду maxlength или действительный адрес электронной почты ..., я имею в виду что-то вроде уровней доступа . Например, я хочу, чтобы некоторые пользователи могли изменять поле (например, productprice) на моем веб-сайте. Где я должен использовать метод User.IsInRole? BLL не имеет никакой ссылки на информацию пользователя. я должен передать некоторые параметры в BLL (например, "bool CanChangePrice"), чтобы уточнить уровни доступа?

Ответы [ 3 ]

6 голосов
/ 29 июля 2010

Ух ты, Камьяр, всего несколько вопросов, завернутых в этом вопросе ;-) Я не уверен, что рассмотрю все возможные варианты, но здесь все в порядке.

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

  • На практике я склоняюсь к тому, чтобы мои EDXM и POCO оставались в одном проекте. У меня просто есть папка Entities, в которой находятся EDXM и Model.Context.tt, папка POCO для Model.tt и моего Virtual POCO (ниже), а также папка Repository для моего хранилища и единицы работы.

  • Я также создаю файл с именем VirtualPOCOs, который является частичным классом, связанным с POCO, генерируемыми вашими T4. Мои проекты обычно тесно связаны со структурой базы данных. VirtualPOCO дает мне небольшую гибкость, чтобы отклоняться от дизайна БД в этих одноразовых ситуациях. Здесь не так уж много, просто те несколько очень специфических потребностей, которые, похоже, есть у каждого проекта.

  • Возможно, вы также захотите рассмотреть хранилище, шлюз табличных данных или настройку активной записи. Все эти модели, скорее всего, будут объединены с Единицей Работы. Существует множество шаблонов дизайна, и ваши потребности или предпочтения могут подтолкнуть вас к тому или иному. Суть в том, чтобы защитить верхние уровни от прямого доступа к контексту EF4. Таким образом, вы можете централизовать управление соединениями и транзакциями и убедиться, что верхние уровни используют только POCO и не случайно держатся за объекты linq-to-sql.

Поставщик членства
Определенно существует раскол между MembershipProvider и EF. Однако вы можете загрузить исходный код для SQLMembershipProvider и преобразовать его для использования EF. Я на самом деле сделал это преобразование. Файл имеет длину около 1500 строк, но не содержит большого количества кода ADO.

То, что вы не спрашивали, но я думаю, что мне следует обратиться, это то, хотите ли вы вообще использовать поставщика членства. Если вы занимаетесь базовым управлением членством и ролями, то поставщик членства, ролей и профилей может сэкономить вам много времени. Для подробного ознакомления с возможностями посмотрите серию на 4GuysFromRolla (http://www.4guysfromrolla.com/articles/120705-1.aspx).

Если ваши потребности более сложны, то, имхо, поставщик членства довольно быстро выходит из строя. Например, когда пользователь регистрируется на вашем сайте, вам сразу нужно создать строки в нескольких разных таблицах. Ну, поставщик членства зарегистрирован через webconfig и использует интерфейс поставщика членства. Он принимает только определенные поля в функции создания. Так что же делать мальчику? Итак, вы можете открыть более крупную транзакцию на вашем контроллере, запустить поставщиков членства, добавить функцию пользователя, запустить собственную MyCustomUserStuff(), а затем зафиксировать транзакцию. Две причины, по которым я нахожу это непривлекательным, заключаются в том, что теперь мой транзакционный код просачивается вверх по моему стеку вызовов, и если все, что мне нужно сделать, это добавить несколько дополнительных полей, то теперь я теперь без необходимости удваиваю свои вызовы базы данных.

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

проверка
Я думаю, что ответ здесь звучит громко - это зависит. Ваши разрешения довольно статичны? то есть те, кто в группе "SiteManagers" могут редактировать весь сайт? Или ваши разрешения гораздо более детализированы? То есть у SiteManager есть доступ к этим 75 полям, разбросанным по этим 22 таблицам, или это больше основано на таблицах? Кроме того, насколько изменчивы разрешения? Нужно ли администратору вашего сайта часто включать / выключать доступ к различным полям в разных таблицах?

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

Кроме того, какой бэкэнд вы используете?Многие DBA сталкиваются с этими решениями.Одна из часто используемых стратегий в этом мире - создать серию представлений, где каждое представление отображает столбцы, которые есть у пользователей.Например, в представлении EmployeesHR будут отображаться только те столбцы, к которым имеют доступ сотрудники отдела кадров, а в EmployeeDirectory будут отображаться только те поля, к которым имеет доступ каталог. Затем пользователям HR предоставляется разрешение на представление HR, но небазовая таблица.Просто мысль.

В любом случае, надеюсь, это поможет.

1 голос
/ 29 июля 2010

1- Мне кажется, что вы различаете слои. Я не буду ссылаться на DAL в пользовательском интерфейсе, поскольку в моих проектах я предпочитаю, чтобы только средний уровень обращался к DAL. Но это не так. Таким образом, вы, кажется, в правильном направлении.

2 - Насколько мне известно, не существует MembershipProvider, который работает с EF.
Итак, в проектах, где мы использовали членство, вот что мы сделали:

  • создал таблицы с aspnet_regsql.exe
  • настроить Web.Config на использование SqlMembershiptProvider
  • добавлено в ДРУГУЮ строку подключения web.config (одна для членства и одна для EF)
  • Создан файл EDMX со всеми таблицами, включая членские.

В коде UserManager / RoleManager (BLL или DAL, в зависимости от вашей архитектуры) получают информацию, используя стандартные методы членства. И всегда используйте объекты Членства, а не объекты EF. Таким образом, фактически часть управления пользователями / ролями отделена от EF.

Мы используем aspnet_* EF-сущности только тогда, когда существует связь между вашими пользовательскими таблицами и таблицей членства (например, если вы хотите связать одну из ваших таблиц с таблицей aspnet_Users, чтобы сохранить ссылку пользователь, который вставил данные).

3- Для правильного управления я бы использовал BLL RightManager, который позволил бы пользовательскому интерфейсу узнать, может ли пользователь изменить поле (чтобы вы могли отключить его или запретить ввод), и использовать эту информацию в Ваш метод проверки.
В моем проекте я использую таблицу Right и связываю право с ролью. В RightManager укажите RequestRight(Right) метод.
Если ваше управление Right слишком простое для создания таблиц, просто используйте User.IsInRole () в вашем RightManager (поэтому я бы использовал его в BLL).
Я бы поместил метод проверки в пользовательский интерфейс, если он «базовый», и в BLL, если он содержит более сложные правила (например, с доступом DAL).

0 голосов
/ 30 июля 2010

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

...