|
Вопрос по архитектуре
|
|||
---|---|---|---|
#18+
Есть 2 библиотеки, в первой библиотеке есть класс в конструкторе которого есть интерфейс. Вторая библиотека добавлена в референс в первой библиотеки. во второй библиотеке этот интерфейс и плюс класс к которому имплементирован этот интерфейс. вопрос. правильно ли то, что интерфейс во второй библиотеке. думаю что неправильно. думаю что интерфейс должен быть в первой библиотеке, там же, где он используется в конструторе класса. PS Вот на примере из жизни. 1я библиотека бизнес логика имеет класс UserService, который содержит в конструкторе IUserRepository. 2я библиотека слой данных и имеет класс UserRepository, который имплементирован от IUserRepository. Думаю перетащить IUserRepository в 1ю библиотеку, чтобы если придеться заменять 2ю библиотку, то 1я не должна будет "сыпаться". Так же думаю IUserService перетащить в клиент из логики. Что скажите? спрашиваю потому как чую, что сейчас не правильно, но не уверен что так правильно потому как в гугл-примерах, так как сейчас у меня. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2016, 00:19 |
|
Вопрос по архитектуре
|
|||
---|---|---|---|
#18+
Попробывал перетащить итерфес и пришел к выводу что вероятно они должны быть вообще в отдельной сборке. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2016, 00:47 |
|
Вопрос по архитектуре
|
|||
---|---|---|---|
#18+
Артем GЧто скажите? лучше код покажи, а то фраза "в конструкторе которого есть интерфейс" уже за гранью добра и зла. конструктор это Sub New, как в нем может быть описан интерфейс - загадка. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2016, 01:06 |
|
Вопрос по архитектуре
|
|||
---|---|---|---|
#18+
AntonariyАртем GЧто скажите? лучше код покажи, а то фраза "в конструкторе которого есть интерфейс" уже за гранью добра и зла. конструктор это Sub New, как в нем может быть описан интерфейс - загадка. кусок кода для примера Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
почитал вот тут линк пишут что создаются persistence layers между слоем данных и логикой и между логикой и интерфейсом ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2016, 01:11 |
|
Вопрос по архитектуре
|
|||
---|---|---|---|
#18+
Артем Gкусок кода для примерагде тут одна библиотека, где вторая? где описание интерфейса и вообще всего того, о чем идет речь в первом посте? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2016, 02:26 |
|
Вопрос по архитектуре
|
|||
---|---|---|---|
#18+
ох, думал на словах будет проще для все ... ситуция то "будничная" ок, раз на словах ни как, тогда выложу код днем. сейчас 4ый час ночи... спасибо за желание помочь. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2016, 03:23 |
|
Вопрос по архитектуре
|
|||
---|---|---|---|
#18+
Все зависит то того, что хочется получить в результате. Поясню на двух примерах: 1. В зависимости от фазы луны мы хотим работать или с файловой системой, или с БД. Тогда выделяем классы, специфичные для типа хранилища в отдельную сборку, а их интерфейс вообще отдельно. FileSystemRepository.dll Код: c# 1.
DatabaseRepository.dll Код: c# 1.
Contracts.dll Код: c# 1.
SomeUsage.dll Код: c# 1. 2. 3. 4.
Соответственно зависимости: SomeUsage.dll -> Contracts.dll DatabaseRepository.dll -> Contracts.dll FileSystemRepository.dll -> Contracts.dll 2. Мы пишем библиотеку FileSystemRepository.dll, которую поставляем как часть SDK. Тогда мы хотим сделать код закрытым для модификаций, тогда все по другому FileSystemRepository.dll Код: c# 1. 2. 3.
SomeUsage.dll Код: c# 1. 2. 3. 4.
Зависимости: SomeUsage.dll -> FileSystemRepository.dll Я оставил за скобкой как именно инъектируются зависимости, но думаю с этим не должно возникнуть проблем. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2016, 08:17 |
|
Вопрос по архитектуре
|
|||
---|---|---|---|
#18+
Артем G, IUserService, IUserRepository, UserService в одной сборке... Реализация IUserRepository в другой. И кстати интерфейс IUserService наверняка на фиг не нужен. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2016, 08:37 |
|
Вопрос по архитектуре
|
|||
---|---|---|---|
#18+
skyANAАртем G, IUserService, IUserRepository, UserService в одной сборке... Реализация IUserRepository в другой. И кстати интерфейс IUserService наверняка на фиг не нужен. Не получится тогда что реализация IUserRepository ссылается на собственного потребителя? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2016, 08:47 |
|
Вопрос по архитектуре
|
|||
---|---|---|---|
#18+
zz118skyANAАртем G, IUserService, IUserRepository, UserService в одной сборке... Реализация IUserRepository в другой. И кстати интерфейс IUserService наверняка на фиг не нужен. Не получится тогда что реализация IUserRepository ссылается на собственного потребителя? Бррр... Ну и формулировочка :) Очевидно, что мы добавим референс на сборку, где реализуется нужный нам интерфейс. Или подключим её иным способом. Но что тут может вызывать не понимания? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2016, 13:00 |
|
Вопрос по архитектуре
|
|||
---|---|---|---|
#18+
Хотя может я Вас не верно понял.. Потребитель реализации IUserRepository - это UserService. При этом ссылки реализации на потребителя нет. Где Вы её усмотрели? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2016, 13:02 |
|
Вопрос по архитектуре
|
|||
---|---|---|---|
#18+
Продемонстрирую картинкой.. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2016, 14:36 |
|
Вопрос по архитектуре
|
|||
---|---|---|---|
#18+
skyANAПри этом ссылки реализации на потребителя нет. Где Вы её усмотрели? В примере на картинке Data ссылается на DomainModel, в которой расположен потребитель репозитория. Такая реализация плохо масштабируема, так как при увеличении числа потребителей и/или интерфейсов (например, при применении I. из S.O.L.I.D.) сборка Data становится "жадной". ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2016, 15:33 |
|
Вопрос по архитектуре
|
|||
---|---|---|---|
#18+
zz118, конкретный пример привести можете? Речь ведь не об абстрактном репозитории, а о конкретном I User Repository, что должен возвращать не что иное как User -ов. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2016, 15:53 |
|
Вопрос по архитектуре
|
|||
---|---|---|---|
#18+
Попробую: Шаг 1. Обычный CRUD Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Шаг 2. Прикручиваем отчетный движок к пользователям Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Шаг 3. Прикручиваем приложение для win-mobile с ограниченным функционалом Код: 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.
Все бы ничего, но проблема находится вот в этой строке: Код: c# 1.
Из-за нее мы в каждый из трех доменов тянем лишние сборки которые там могут быть в принципе не релевантны. Вдобавок, UserRepository начинает обладать знаниями о том кто и как его использует. Как следствие, мы не сможем разрабатывать его отдельно. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2016, 16:32 |
|
Вопрос по архитектуре
|
|||
---|---|---|---|
#18+
zz118, амн... А при чём тут моё предложение: "IUserRepository, UserService в одной сборке... Реализация IUserRepository в другой"? Реализаций IUserRepository может быть несколько, каждая в своей сборке. И каждая из них будет зависеть только от того, что ей действительно нужно. И соответсвенно в конкретном приложении будет подключена конкретная сборка. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2016, 16:50 |
|
Вопрос по архитектуре
|
|||
---|---|---|---|
#18+
skyANAzz118, амн... А при чём тут моё предложение: "IUserRepository, UserService в одной сборке... Реализация IUserRepository в другой"? Реализаций IUserRepository может быть несколько, каждая в своей сборке. И каждая из них будет зависеть только от того, что ей действительно нужно. И соответсвенно в конкретном приложении будет подключена конкретная сборка. 1. Создал проект на GitHub Для того, чтобы можно было глянуть в живую что и как 2. На картинке видно что IUserRepository в сборке DataAccess. Там где реализация, то есть вместе с UserRepository. Видно что сборка BusinessLogic использует IUserRepository в конструкторе. Я все еще в процессе обучения и поэтому не знаю как правильно. Этот вариант был взят из интернета. Я засомневалася что IUserRepository толжен быть с сборке DataAccess. Теперь вопросы. 1. Оставить IUserRepository в DataAccess? - это правильно? 2. Перенсти в BusinessLogic. Как тогда имплементировать IUserRepository для UserRepository? 3. Создать отдельную сборку (видел вариант с названием Persistent) которая добавляется и в BusinessLayer и в DataAccess. 4. Если переносим IUserRepository из DataAccess что делать с моделями. На картинке видно что DataAccess имеет модель User а IUserRepository содержит функцию User GetUser(int Id); Вобщем вопросов куча (( не понять толком как правильно ... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2016, 18:35 |
|
Вопрос по архитектуре
|
|||
---|---|---|---|
#18+
автор1. Оставить IUserRepository в DataAccess? - это правильно? да автор4. Если переносим IUserRepository из DataAccess что делать с моделями. На картинке видно что DataAccess имеет модель User а IUserRepository содержит функцию User GetUser(int Id); POCO объекты доменной модели лучше держать в отдельной сборке MyProject.BusinessObjects, MyProject.Entities, MyProject.DomainModel... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2016, 18:49 |
|
Вопрос по архитектуре
|
|||
---|---|---|---|
#18+
zz118автор1. Оставить IUserRepository в DataAccess? - это правильно? да автор4. Если переносим IUserRepository из DataAccess что делать с моделями. На картинке видно что DataAccess имеет модель User а IUserRepository содержит функцию User GetUser(int Id); POCO объекты доменной модели лучше держать в отдельной сборке MyProject.BusinessObjects, MyProject.Entities, MyProject.DomainModel... Ок понял. Сделаю именно так. Но все же переспрошу. Студенческий вопрос :). То есть это нормально, что в сборке BusinessLogic требуется IUserRepository, но сборка не предоставляет возможности использовать саму сборку без сборки DataAccess в которой IUserRepository находится? PS/ в дополнение... Сейчас понимаю, что если я перенсу IUserRepository в BusinessLogic то придется или подключать Domain в котором будет модель User, дополнительно не понять как имплементировать IUserRepository во время реализации UserRepository (наверное ни как :) ). Спасибо за ответы. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2016, 19:13 |
|
Вопрос по архитектуре
|
|||
---|---|---|---|
#18+
Артем G1. Оставить IUserRepository в DataAccess? - это правильно? 2. Перенсти в BusinessLogic. Как тогда имплементировать IUserRepository для UserRepository? 3. Создать отдельную сборку (видел вариант с названием Persistent) которая добавляется и в BusinessLayer и в DataAccess. Не место IUserRepository в одной сборке с конкретным UserRepository. Можете конечно оставить там, тогда реализацию надо вынести в сборку: DataAccess.SqlClient, или DataAccess.NHibernate, или DataAccess.EntityFramework, или DataAccess.MongoDB, - в зависимости от начинки этой самой реализации. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2016, 19:39 |
|
Вопрос по архитектуре
|
|||
---|---|---|---|
#18+
Артем G, вот зачем в BusinessLogic ссылка на DataAccess? В том проекте, где используете логику (консолька, сервис, сайт, формы), там и добавляйте ссылку на ту реализацию доступа к данным, что нужна. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2016, 19:50 |
|
Вопрос по архитектуре
|
|||
---|---|---|---|
#18+
zz118POCO объекты доменной модели лучше держать в отдельной сборке MyProject.BusinessObjects, MyProject.Entities, MyProject.DomainModel...И что это даст и в каких случаях? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2016, 19:52 |
|
Вопрос по архитектуре
|
|||
---|---|---|---|
#18+
skyANAАртем G, вот зачем в BusinessLogic ссылка на DataAccess? В том проекте, где используете логику (консолька, сервис, сайт, формы), там и добавляйте ссылку на ту реализацию доступа к данным, что нужна. На скрине что выше видно, что сейчас IUserRepository в DataAccess, и в BusinessLogic в конструкторе UserService. Поэтому ссылка. На скрине что ниже видно что в консоле ссылка на BusinessLogic и в консоле используется UserService. skyANAАртем G1. Оставить IUserRepository в DataAccess? - это правильно? 2. Перенсти в BusinessLogic. Как тогда имплементировать IUserRepository для UserRepository? 3. Создать отдельную сборку (видел вариант с названием Persistent) которая добавляется и в BusinessLayer и в DataAccess. Не место IUserRepository в одной сборке с конкретным UserRepository. Можете конечно оставить там, тогда реализацию надо вынести в сборку: DataAccess.SqlClient, или DataAccess.NHibernate, или DataAccess.EntityFramework, или DataAccess.MongoDB, - в зависимости от начинки этой самой реализации. Идея с DataAccess.EntityFramework очень даже симпотична. Выглядит логично. Cпасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2016, 20:31 |
|
Вопрос по архитектуре
|
|||
---|---|---|---|
#18+
Артем Gzz118пропущено... да пропущено... POCO объекты доменной модели лучше держать в отдельной сборке MyProject.BusinessObjects, MyProject.Entities, MyProject.DomainModel... Ок понял. Сделаю именно так. Но все же переспрошу. Студенческий вопрос :). То есть это нормально, что в сборке BusinessLogic требуется IUserRepository, но сборка не предоставляет возможности использовать саму сборку без сборки DataAccess в которой IUserRepository находится? PS/ в дополнение... Сейчас понимаю, что если я перенсу IUserRepository в BusinessLogic то придется или подключать Domain в котором будет модель User, дополнительно не понять как имплементировать IUserRepository во время реализации UserRepository (наверное ни как :) ). Спасибо за ответы. Если есть у кого-нибудь ответ на вопрос, то интересно было бы услышать. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2016, 23:38 |
|
Вопрос по архитектуре
|
|||
---|---|---|---|
#18+
Артем GЕсли есть у кого-нибудь ответ на вопрос, то интересно было бы услышать. Я постарался описать сценарий, когда это не нормально (когда нужно "на лету" переключать зависимости). Не похоже что это Ваш случай, так что не вижу никаких рисков в такой зависимости. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2016, 08:04 |
|
|
start [/forum/topic.php?fid=20&msg=39211642&tid=1400673]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
206ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
others: | 313ms |
total: | 621ms |
0 / 0 |