2009-05-20 2 views
55

Я вижу две основные «школы мыслей», когда дело доходит до создания более масштабных корпоративных приложений на .NET (Winforms, WPF, ASP.NET).Образцовый шаблон против «умных» бизнес-объектов

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

В другом лагере используются то, что я называю «умными» бизнес-объектами, которые знают, как загружать себя, и обычно они имеют метод Save(), возможно, Update() или даже Delete(). Здесь вам действительно не нужен репозиторий - сами объекты знают, как загружать и спасать себя.

Большой вопрос:: который вы используете или предпочитаете? И почему?

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

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

Спасибо за любой конструктивный ввод!

ответ

38

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

+3

В этом случае один общий репозиторий должен знать, как загружать все типы объектов. –

+0

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

+4

Мне также нравится стиль репозитория, потому что объекты передачи данных более гибкие. Вы можете использовать их везде, не зависимо от фреймворков, слоев и т. Д. Они представляют собой просто концепцию, модель. Если вам нужен мост между моделью и BD, вы создаете слой сохранения. Вам нужен мост между моделью и пользователем, с которым вы создаете пользовательский интерфейс. Вы хотите вычислить вещи, чтобы реализовать варианты использования, вы строите бизнес-логику. Все относится к просто объектам модели, которые не привязаны ни к чему, кроме самой бизнес-концепции. – helios

15

Шаблон репозитория не обязательно приводит к немым объектам. Если у объектов нет логики вне Save/Update, вы, вероятно, слишком много работаете за пределами объекта.

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

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

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

+0

Нет, конечно - мой busobj не совсем «тупой» - я просто имел в виду «тупой», потому что они не знают, как загружать и спасать себя - у них есть другие функции, obviuosly :-) –

+0

Это здорово дизайн. Я лично вижу, что «бо знает, чтобы загрузить себя» в качестве причины не нанимать разработчика - очевидно, никогда не слышал о разделении ответственности и никогда не видел должным образом инкапсулированного DAL. – TomTom

+0

Вы использовали CSLA? Он хорошо зарекомендовал себя в проекте, который мы использовали для этого, в котором используется развертывание N-уровня. – Fireworks

4

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

Без наличия объекта ActiveRecord в самом репозитории, как бы вы изолировали извлечение данных в своих тестовых случаях? Вы не можете действительно подделать или издеваться над этим.

Помимо тестирования также было бы намного сложнее заменить технологии доступа к данным, например, от Linq-to-SQL до NHibernate или EntityFramework (хотя это часто случается не часто).

1

Это действительно зависит от потребностей приложения, но при работе со сложной бизнес-модели, я предпочитаю ActiveRecord.Я могу инкапсулировать (и проверить) бизнес-логику в одном месте.

Большинство ORM (EF, nHibernate и т. Д.) Служат в качестве вашего репозитория. Многие люди считают слой поверх ORM, который инкапсулирует все взаимодействие данных как репозиторий, который, как я считаю, неверен. По словам Мартина Фаулера, репозиторий инкапсулирует доступ к данным в виде коллекции. Поэтому, имея индивидуальные методы для всех извлечения/мутации данных, можно использовать Data Mapper или Object Access Object.

Использование ActiveRecord, мне нравится иметь базовый класс «Entity». Обычно я использую ORM (репозиторий) с этим базовым классом, поэтому все мои объекты имеют методы GetById, AsQueryable, Save и Delete.

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