Использование сущностей Entity Framework в качестве бизнес-объектов? - PullRequest
53 голосов
/ 20 октября 2008

Я использую Entity Framework O / R mapper от Microsoft и использую классы сущностей (сгенерированные классы, которые отображаются в объекты БД) в качестве бизнес-объектов. Это нормально? Пожалуйста, укажите ваши минусы или плюсы. Что делать в случае связи WCF между бизнес-уровнем и представлением, как отправить эти объекты в качестве элементов данных?

Ответы [ 7 ]

31 голосов
/ 01 июля 2011

Во-первых, на момент написания 11 000 вопросов я немного удивлен отсутствием ответов и при всем уважении к качеству ответов, учитывая довольно простой вопрос.

Итак, теперь, когда я немного высказался, я хотел бы ответить на этот вопрос (-ы), потому что я думаю, что он применим еще больше сегодня с недавним выпуском Entity Framework Code-First.

"Использование сущностей Entity Framework как бизнес-объекты? "

Несколько разъяснений, прежде чем я начал:

  • Когда вы говорите «бизнес-объекты», у меня складывается впечатление, что эти объекты, на которые вы ссылаетесь, содержат правила или логику, например, от простой проверки (т. Е. Обязательные поля) до более сложной логики (т. Е. Обработка). налог на выезд).

  • Я не думаю, что смогу ответить на ваш вопрос о WCF. Причина этого заключается в том, что я собираюсь объективно ответить на ваши вопросы об EF как о бизнес-объектах, которые затем субъективно заставят меня занять позицию, противоречащую моей попытке искренне и объективно ответить на первый вопрос.

Тем не менее, на ваш EF как вопросы бизнес-объектов ...

"Я использую Entity Framework O / R mapper от Microsoft и используя юридическое лицо классы (сгенерированные классы, которые сопоставлены с объектами БД) как бизнес объекты. Это нормально? "

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

«Пожалуйста, укажите ваши минусы или плюсы»

Я рад, что вы спросили! Я буду рад ответить на этот вопрос, и надеюсь, что, учитывая все за и против, вы сможете принять обоснованное решение относительно того, считаете ли вы, что использование EF для ваших бизнес-объектов - это нормально. Как правило, я бы выделял все «за» и «против», облегчая «переваривание», однако я не думаю, что это уместно здесь, потому что я думаю, что мы допустили бы несправедливость по отношению к такой очень интересной теме, которая также близка и дорогой моему сердцу.

Прежде всего, позвольте мне немного поговорить технически ... Вы можете использовать объекты EF, так как ваши бизнес-объекты технически ничто не мешает вам сделать. Фактически, EF Code-First (CF) делает это невероятно простым, позволяя вам создавать POCO и давая вам возможность применять аннотации данных для простой проверки, а также реализовывать IValidatableObject для более сложной проверки. Довольно круто, а?

В этом суть обсуждения.

EF или любой ORM предназначен для поддержки управления данными. Его главная ответственность - данные, и поэтому создаваемые вами объекты ориентированы на данные. Так что, если вы пытаетесь спроектировать свои объекты по поведению, у вас есть небольшая головоломка. В двух словах, эта загадка называется несоответствием импеданса. Изобразите это; в вашем приложении есть два обязательных варианта использования:

  1. Экран для редактирования пользователя
  2. Элемент управления для отображения только для чтения подмножества пользовательской информации

Если вы используете EF (любой вариант) или любой ORM в этом отношении, вы можете стремиться использовать один и тот же объект «Пользователь» для обработки возможности сохранения пользователя, а также извлечения пользователя для извлечения подмножества чтения и чтения. только поля. Вы, вероятно, делаете это по одной из нескольких причин:

  1. Как и многие разработчики, нам посеяно это зерно во время обучения, поскольку «консолидация кода» имеет первостепенное значение или, возможно, более известна как СУХОЙ - не повторяйте себя, и поэтому вы можете посмотреть на дублирование кода, например свойства, в отрицательном контексте.
  2. ORM, такие как EF 4.1, имеют текТехнические ограничения (и хакерские обходные пути), такие как сопоставление нескольких POCO / объектов в одну таблицу базы данных, что вынуждает вас делать это независимо от ваших убеждений.
  3. Это быстрый и простой способ запустить и запустить приложение
  4. Чувствуется, что это правильно

В этом есть свои преимущества и недостатки, и вы можете посмотреть на это как положительно, так и отрицательно, в зависимости от вашего мнения.

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

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

Независимо от вашего мнения, мы, вероятно, все можем согласиться с тем, что этот бизнес-объект взял на себя множество обязанностей, и поведение (а не данные!) Объекта в лучшем случае является вторичным. Его основная ответственность заключается в управлении данными, а второстепенными обязанностями является обработка простых и сложных бизнес-правил, связанных с редактированием пользователя и отображением информации только для чтения. В объектно-ориентированном проектировании (OOD), если дизайн объекта характеризуется своей индивидуальностью и поведением, этот объект может быть одним запутанным человеком, поскольку он не придерживается самого определения OOD.

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

Так, как все это связано с тем, должен ли я использовать EF для представления своих бизнес-объектов?

Ну ... Хотя это технически возможно, существуют разные философии (некоторые хорошие, некоторые плохие) относительно того, следует ли использовать EF или какой-либо ORM для представления своих бизнес-объектов. Я дал краткий обзор, нацеленный на суть этих философий выше, но они задокументированы гораздо более подробно такими людьми, как Роки Лхотка и Мартин Фаулер.

Направление, которое вы выберете, скорее всего, будет зависеть от приложения и с философской точки зрения, может зависеть от того, насколько вы идеалист или прагматик. Тем не менее, я не намекаю на то, что человек, являющийся идеалистом или прагматиком, коррелирует с использованием EF для бизнес-объектов или без него - это просто повлияет на ваше мнение об этом.

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

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

Не отвечайте на вопрос о том, является ли постоянное невежество с ORM нелепым, учитывая, что целью является управление данными. :-) Извините, я не удержался!

20 голосов
/ 20 октября 2008

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

Также посмотрите на эту ссылку на MSDN , которая описывает некоторые распространенные сценарии использования с EF в отношении Business Logic.

13 голосов
/ 20 октября 2008

Платформа Entity была разработана для объектов сущностей, которые будут использоваться в качестве бизнес-объектов, но следует учитывать, что бизнес-объекты будут привязаны к технологии O / R, а также к модели EDM. В EF 1.0 не было никакой поддержки постоянство-невежество сценариев, но поддержка была добавлена ​​в 4.0. Вы можете реализовать интерфейсы , если не хотите использовать ни один из их базовых классов.

Начиная с .NET 3.5 с пакетом обновления 1 (SP1), они также должны использоваться в качестве параметров и возвращаемых типов в методах службы WCF без какого-либо дополнительного кода.

4 голосов
/ 02 декабря 2008

Есть два ограничения, о которых я должен знать:

  1. Унаследованные объекты не могут иметь свойства навигации, т. Е. Если у вас есть класс «персона», а затем «клиент» и «поставщик», то эти клиенты и поставщики не могут иметь свойства навигации.

  2. Методы и вычисляемые поля (все в частичных классах) не передаются через ADO.Net Data Services - если вы также используете ADO.Net Data Services, то все, что вы расширяете объекты Entity Framework в частичных классах, не будет передаваться через службы данных ADO.Net.

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

4 голосов
/ 20 октября 2008

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

В нашем случае только представление передается на уровень представления. Мы делаем это, чтобы контролировать способ представления данных и применять защитную проверку данных, поступающих из уровня представления.

В случае использования объектов EF в транзакции WCF вы потеряете контекст объекта, с которым был связан объект EF. В CodePlex есть некоторые усилия, которые пытаются помочь с этим, но я не поспевал за их усилиями.

3 голосов
/ 11 ноября 2008

Разве вы не можете просто повторно присоединить объекты, если они теряют свой исходный контекст объекта? Вам, однако, придется самостоятельно решать проблемы с параллелизмом.

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

2 голосов
/ 20 февраля 2010

Пример приложения BookLibrary WPF Application Framework (WAF) показывает, как шаблон Model-View-ViewModel (MVVM) можно использовать в сочетании с Entity Framework.

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