Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
IoC. Постепенный перевод проекта. Возможно ли
|
|||
|---|---|---|---|
|
#18+
Попробовал перевести проект на IoC. но не сразу все, а постепенно. Возможно ли такое или придется все сразу переделывать? И еще вопрос с реализацией. Использую Autofac пока. На нем тренируюсь. Начал с репозиторий. Взял 1 из репозиторий, она является самостоятельным классом и реализовал интерфейс. Теперь класс выглядит так: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. Прописал при запуске конфигурацию IoC Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Теперь вопрос, как поступить вот с этим: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Если я все правильно понимаю, то данный класс должен быть также наследовать интерфейс IDataManager? Что здесь лишнее или что я забыл, чтобы часть, а именно UserRepository заработала, как DI? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 09:54 |
|
||
|
IoC. Постепенный перевод проекта. Возможно ли
|
|||
|---|---|---|---|
|
#18+
PavluhaВозможно ли такое или придется все сразу переделывать? возможно. но рекомендую задаться целью, для чего вам нужен DI, и какие преимуществ конкретно вы хотите добиться? так вам будет проще, чем тупо "переводить всё на DI". PavluhaЧто здесь лишнее или что я забыл, чтобы часть, а именно UserRepository заработала, как DI? старайтесь передавать зависимости через конструктор: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 11:26 |
|
||
|
IoC. Постепенный перевод проекта. Возможно ли
|
|||
|---|---|---|---|
|
#18+
Pavluha, если где-то получается, что компонент требует много зависимостей (и вам кажется, что конструктор от этого распух), значит проблема в архитектуре. также постарайтесь избежать "аггрегатора" зависимостей, собирающего кучу зависимостей и раздающего направо и налево. лучше передать фабрику на базе DI-контейнера. Autofac, кстати, хороший выбор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 11:28 |
|
||
|
IoC. Постепенный перевод проекта. Возможно ли
|
|||
|---|---|---|---|
|
#18+
hVostt, Сейчас сделал так и пока работает, но хотелось бы комментариев на правильность: Код: c# 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. 27. 28. 29. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 11:58 |
|
||
|
IoC. Постепенный перевод проекта. Возможно ли
|
|||
|---|---|---|---|
|
#18+
PavluhaСейчас сделал так и пока работает, но хотелось бы комментариев на правильность: плохо. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. получайте IUserRepository через конструктор (как я показал выше). и постарайтесь свести использование DependencyResolver к минимуму. желательно, чтобы он вообще не появлялся, ну кроме тех мест, где механизм разрешения зависимостей DI недоступен (например, в HttpApplication). и ещё один момент. у вас IDataManager выполняет роль DI, отдавая ModelDataContextWrapper с помощью метода Get(). зачем? получайте свой ModelDataContextWrapper точно также через DI. или через фабрику. а вообще при использовании репозитория, дата контекст вообще не нужен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 12:27 |
|
||
|
IoC. Постепенный перевод проекта. Возможно ли
|
|||
|---|---|---|---|
|
#18+
hVosttполучайте свой ModelDataContextWrapper точно также через DI А пример можно? Просто у меня модель используется DBML не EF. В инете ничего путного не нашел. А сам DataManager это менеджер репозиторий с lazy инициализацией. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 13:32 |
|
||
|
IoC. Постепенный перевод проекта. Возможно ли
|
|||
|---|---|---|---|
|
#18+
hVostt, Вроде начал догонять. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. У меня репозиторий вот столько: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Их все в конструкторе указывать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 13:37 |
|
||
|
IoC. Постепенный перевод проекта. Возможно ли
|
|||
|---|---|---|---|
|
#18+
Фабрику реализовал: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Теперь вообще запутался, куда и как ее прикручивать ((( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 14:06 |
|
||
|
IoC. Постепенный перевод проекта. Возможно ли
|
|||
|---|---|---|---|
|
#18+
PavluhaТеперь вообще запутался, куда и как ее прикручивать ((( не-не.. Код: c# 1. и получайте где требуется IModelDataContext. незачем пилить свою собственную фабрику, если не планируется использовать её как точку расширения, или не используются дополнительные вариативные зависимости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 14:09 |
|
||
|
IoC. Постепенный перевод проекта. Возможно ли
|
|||
|---|---|---|---|
|
#18+
hVostt, IModelDataContext не реализован, да и как его реализовать понятия не имею. В EF как-то файл *.tt переписывали, а с dbml вообще непонятно или все не так понимаю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 14:12 |
|
||
|
IoC. Постепенный перевод проекта. Возможно ли
|
|||
|---|---|---|---|
|
#18+
PavluhaИх все в конструкторе указывать? указывайте в конструкторе только те, которые реально используются. зачем все? а SubmitChanges() я бы вынес отдельно: Код: c# 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 14:14 |
|
||
|
IoC. Постепенный перевод проекта. Возможно ли
|
|||
|---|---|---|---|
|
#18+
А если вот так сделать Код: c# 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 14:15 |
|
||
|
IoC. Постепенный перевод проекта. Возможно ли
|
|||
|---|---|---|---|
|
#18+
PavluhaIModelDataContext не реализован, да и как его реализовать понятия не имею. не обязательно интерфейс. можете класс зарегистрировать, без IModelDataContext. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 14:15 |
|
||
|
IoC. Постепенный перевод проекта. Возможно ли
|
|||
|---|---|---|---|
|
#18+
PavluhaА если вот так сделать Код: c# 1. да, можно и так. в зависимости от того, что вам от него нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 14:16 |
|
||
|
IoC. Постепенный перевод проекта. Возможно ли
|
|||
|---|---|---|---|
|
#18+
hVostt, Нужен сам контекст Код: c# 1. 2. 3. 4. Чтобы потом его убрать из DataManager и использовать, как вы описали ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 14:17 |
|
||
|
IoC. Постепенный перевод проекта. Возможно ли
|
|||
|---|---|---|---|
|
#18+
PavluhaА сам DataManager это менеджер репозиторий с lazy инициализацией. Lazy-инициализация: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 14:19 |
|
||
|
IoC. Постепенный перевод проекта. Возможно ли
|
|||
|---|---|---|---|
|
#18+
PavluhahVostt, Нужен сам контекст Код: c# 1. 2. 3. 4. Чтобы потом его убрать из DataManager и использовать, как вы описали Код: c# 1. если для ASP.NET MVC вы используете интеграцию Autofac.Mvc, то InstancePerLifetimeScope означает время жизни HttpContext. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 14:21 |
|
||
|
IoC. Постепенный перевод проекта. Возможно ли
|
|||
|---|---|---|---|
|
#18+
hVostt, Тогда получается все в конструкторе указывать, все репозитории? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 14:21 |
|
||
|
IoC. Постепенный перевод проекта. Возможно ли
|
|||
|---|---|---|---|
|
#18+
PavluhahVostt, Тогда получается все в конструкторе указывать, все репозитории? все, которые нужны , если где-то нужны вообще все, значит что-то не так с архитектурой. но если их слишком много, тогда можно обойтись публичными попертями в Lazy-обёртке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 14:24 |
|
||
|
IoC. Постепенный перевод проекта. Возможно ли
|
|||
|---|---|---|---|
|
#18+
Если я все правильно понял, то принцип такой: Код: c# 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. 27. 28. 29. 30. 31. 32. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 14:25 |
|
||
|
IoC. Постепенный перевод проекта. Возможно ли
|
|||
|---|---|---|---|
|
#18+
PavluhaЕсли я все правильно понял, то принцип такой: да, всё верно, в этом и смысл ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 14:28 |
|
||
|
IoC. Постепенный перевод проекта. Возможно ли
|
|||
|---|---|---|---|
|
#18+
hVostt, Тогда есть несколько вопрос по вашим Вы сказали: все, которые нужны, если где-то нужны вообще все, значит что-то не так с архитектурой. но если их слишком много, тогда можно обойтись публичными попертями в Lazy-обёртке. Как тогда поступить с классом DataManager, если это класс есть простое хранилище всех репозиторий И ссылка на него передается в фабрике: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. Неправильная архитектура? Т.к. в конструкторе придется передавать все репозитории. Где я ошибся? Явно что-то не так Потому что в контроллере дальше идет такие вещи типа: Код: c# 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 14:33 |
|
||
|
IoC. Постепенный перевод проекта. Возможно ли
|
|||
|---|---|---|---|
|
#18+
PavluhaКак тогда поступить с классом DataManager, если это класс есть простое хранилище всех репозиторий у вас уже есть DI (который Autofac), который является хранилищем всех репозиторий. зачем вам ещё один, свой? единственный полезный метод SaveChanges стоит вынести в отдельный интерфейс типа IUnitOfWork, и использовать его там, где требуется сохранение информации. PavluhaПотому что в контроллере дальше идет такие вещи типа: Код: c# 1. если хотите работать в контроллере с пользователями, получайте в контроллере объект IUserRepository. в общем, получаейте те репозитории, которые вам в контроллере нужны. если же у вас контроллер, которому нужны все репозитории, то наверное это не очень хороший контроллер, может его разделить на несколько? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 14:46 |
|
||
|
IoC. Постепенный перевод проекта. Возможно ли
|
|||
|---|---|---|---|
|
#18+
hVostt, Но тогда получается надо абстрагироваться от определенных репозиторий и передавать, например, IRepository, и уже в контроллере приводить его к типу IUserRepository. И тогда класс DataManager вообще не нужен. (Есть контроллеры, в которых необходим доступ к др репозитории, что ограничивает фабрику контроллеров) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 15:04 |
|
||
|
IoC. Постепенный перевод проекта. Возможно ли
|
|||
|---|---|---|---|
|
#18+
Почему я ввязался в IoC. Стали возникать потребности в поддержке других СУБД, вот я и решил переписать DAL. Т.е. таким способом, если возникнет вопрос о реализации поддержки другой СУБД, то достаточно написать другой DAL для той СУБД, а все остальное вообще не изменится. Правильный ли данный подход или надо было не городить огород, а просто использовать абстрактную фабрику и все? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2014, 15:11 |
|
||
|
|

start [/forum/topic.php?fid=18&msg=38628918&tid=1357367]: |
0ms |
get settings: |
5ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
28ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
| others: | 219ms |
| total: | 314ms |

| 0 / 0 |
