|
|
|
Вопрос архитектурного плана
|
|||
|---|---|---|---|
|
#18+
Доброе время суток коллеги. Решил написать приложение с использованием шаблона DDD, но возникло несколько вопросов архитектурного характера. Вот простенькая модель сущностей Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. Весь CRUD этих сущностей я вынес в репозитории. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Для работы с БД использую NHibernate, соответственно реализовал эти репозитории - <репозиторий>NH. Каждый репозиторий в конструкторе получает ISession. Для создания репозиториев я ввел интерфейc: Код: plaintext 1. 2. 3. 4. 5. 6. Реализовал RepositoryFactoryNH где конфигурируется NHibernate, открывается сессия и передается в репозитории. В коде я уже пользуюсь IRepositoryFactory Теперь собственно вопросы. 1) Как использовать IRepositoryFactory так что бы при замене RepositoryFactoryNH на RepositoryFactoryEF не пришлось лазать по коду и менять new RepositoryFactoryNH на new RepositoryFactoryEF ? 2)Должны ли сущности знать о существовании IRepositoryFactory или о конкретном репозитории? 3)Например мне нужно сохранить модуль только в том случае если если Name != "Module1". Куда поместить этот код? В репозиторий? токда эта логика будет дублироваться в пакетах репозиториев. В общем прошу совета. За ранее спасибо. С/У DIM@STY ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2010, 09:24 |
|
||
|
Вопрос архитектурного плана
|
|||
|---|---|---|---|
|
#18+
Dim@sty, 1) Посмотрите GoF - AbstractFactory. http://www.dofactory.com/Patterns/PatternAbstract.aspx Вам нужно добавть abstract factory и 2 concrete factories 2) Модель не должна знать о factory но должна знать о конкретном репозитории. 3) В домене. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2010, 11:54 |
|
||
|
Вопрос архитектурного плана
|
|||
|---|---|---|---|
|
#18+
Dmitry Sukhovilin, Спасибо за ответ. Я только начинаю щупать DDD поэтому возникают проблемы. Получается объект должен знать, что его состояние куда то сохраняется? и в нем же делегировать вызовы репозиторию? т.е. что то типа Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2010, 13:48 |
|
||
|
Вопрос архитектурного плана
|
|||
|---|---|---|---|
|
#18+
Dim@sty, Не совсем, объект должен иметь признак или набор признаком указывающие можно ли его сохранять или нет. Например: HasChanged, IsNew и т.д. в EF эти признаки прописаны в базовом классе. В даннм случае модель показывает, что она валидна и может сохранится. Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2010, 14:07 |
|
||
|
Вопрос архитектурного плана
|
|||
|---|---|---|---|
|
#18+
Dim@styDmitry Sukhovilin, Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Это очень похоже на active record :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2010, 14:08 |
|
||
|
Вопрос архитектурного плана
|
|||
|---|---|---|---|
|
#18+
Dmitry Sukhovilin Это очень похоже на active record :) Так вот и я про то же. Зачем же тогда модели знать о конкретном репозитории? автор В даннм случае модель показывает, что она валидна и может сохранится. Опять же надо где то проверить IsValid Код: plaintext 1. 2. Может быть в слое служб? Например Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. А это уже получается transaction script..... Чего то у меня вообще мозг взрывается. Буду благодарен за любые советы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2010, 15:41 |
|
||
|
Вопрос архитектурного плана
|
|||
|---|---|---|---|
|
#18+
Dim@styDmitry Sukhovilin Это очень похоже на active record :) Так вот и я про то же. Зачем же тогда модели знать о конкретном репозитории? Репозиторий должен знать о модели, что бы вызврашять ее из источника наззных. Я не много опечатался. Сорри. :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2010, 15:54 |
|
||
|
Вопрос архитектурного плана
|
|||
|---|---|---|---|
|
#18+
Dim@sty... Может быть в слое служб? Например ... Именно в нем, родимом... Dim@sty... А это уже получается transaction script..... А кто сказал, что это плохо? Вообще, Repository - это довольно "низкоуровневый" слой, его задача - инкапсулировать доступ к сохраняемому состоянию модели (Domain Model), ниже него уже только Store (хошь БД, а хошь - массивы в памяти). А вот то, что наворочено выше Repository - целиком на воображении архитектора/разработчика, можно и Active Record с BL внутри DM, а можно и Service Layer с отделенной BL и "тупой" DM (до уровня DTO/POCO). З.Ы. и не надо такого "тяжеловесного" вытаскивания IModuleRepository в ModuleService: ... GetReositoryFactory().GetModuleRepository() .Save(module); ... достаточно инжектировать IModuleRepository в конструкторе ModuleService: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2010, 17:51 |
|
||
|
Вопрос архитектурного плана
|
|||
|---|---|---|---|
|
#18+
Dmitry Sukhovilin... Репозиторий должен знать о модели... В общем случае - не обязательно... (генерики придумали не вчера). Вот такой репозиторий ничего не знает о модели, которую он возвращает (кроме того, что у нее есть свойство Key): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2010, 18:10 |
|
||
|
Вопрос архитектурного плана
|
|||
|---|---|---|---|
|
#18+
qu-quDmitry Sukhovilin... Репозиторий должен знать о модели... В общем случае - не обязательно... (генерики придумали не вчера). Так можно реализовать только CRUD, приходится расширять CRUD репозиторий специфичными для данного репозитория методами. И не всегда эти расширенные методы работают с <T>. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2010, 20:21 |
|
||
|
Вопрос архитектурного плана
|
|||
|---|---|---|---|
|
#18+
qu-quDim@sty... Может быть в слое служб? Например ... Именно в нем, родимом... Dim@sty... А это уже получается transaction script..... А кто сказал, что это плохо? Martin Fowler ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2010, 20:22 |
|
||
|
Вопрос архитектурного плана
|
|||
|---|---|---|---|
|
#18+
qu-quDmitry Sukhovilin... Репозиторий должен знать о модели... В общем случае - не обязательно... (генерики придумали не вчера). Вот такой репозиторий ничего не знает о модели, которую он возвращает (кроме того, что у нее есть свойство Key): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Существует более высокая вероятность дублирования кода валидации в этом случае imho. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2010, 20:24 |
|
||
|
|

start [/forum/topic.php?fid=17&fpage=59&tid=1351350]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
50ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
| others: | 259ms |
| total: | 423ms |

| 0 / 0 |
