![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| resiork |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 2.8.2011 Репутация: нет Всего: нет |
Есть клиентское приложение MVVM (WPF+C#), которое работает с БД (MSSQL) через одно из двух расширений (Add-In, MAF).
Первое расширение предоставляет доступ к БД через серверную прослойку в виде WindowsService, второе расширение- подключается напрямую к SQL-серверу. Приложение может переключать расширения (выбирать источник данных) "на лету". Вопрос в следующем: как будет правильнее всего организовать переключение источников данных на лету? Мои мысли: 1. Оба расширения должны наследоваться от одного класса (какой-нибудь DataDriver) или реализовывать общий интерфейс, а при активации расширения в экземпляре клиента будет выполняться что-что типа:
2. Так как серверная прослойка (WS) и второе расширение будут использовать одинаковый код для доступа к данным, нужно этот повторно используемый код обернуть в подходящий шаблон (скорее всего). Пытался обойтись наследованием или композицией, всё равно возникают куски повторяющегося кода. |
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 22 Всего: 118 |
а одно приложение нельзя писать? Все через wcf и делать, а если надо коннект можно сделать локальным (на self-hosted wcf) через пайпы....
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| resiork |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 2.8.2011 Репутация: нет Всего: нет |
jonie, не, одно нельзя. Вся суть в том, чтобы сделать всё именно в таком виде, как написано.
Дополнение: клиентская прога, кстати, с WindowsService по WCF общается. |
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 22 Всего: 118 |
ну я право непонимаю зачем (это получается две программы, поверьте это геморрой) -ну реализуйте интерфейс вашего сервиса (который wcf) (если хочется), и создавайте явным образом его экземпляр и дергайте его методы, а уж он будет работать напрямик с базой....
в одном случае вы будете работать с wcf proxy, в другом - с ссылкой на экземпляр "сервиса".... -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| resiork |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 2.8.2011 Репутация: нет Всего: нет |
jonie, я верю вам, что геморрой
но задача поставлена именно так:
и обсуждению это не подлежит. Ни при каких условиях. так что, нужно просто поработать с тем, что есть, каким бы геморроем это не сулило |
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 22 Всего: 118 |
resiork, ну и где вы видете запрет на использование клиентом кода WCF сервиса напрямую (без собственно wcf - путем создания экземпляра класса, реализующего wcf сервис)?
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| resiork |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 2.8.2011 Репутация: нет Всего: нет |
jonie, а разве фраза "с базой напрямую" предполагает использование прокладки в виде WCF?
если так, то задача упрощается но, по-моему, WCF в этом месте использовать не нужно, хотя и очень хочется, и максимум, что можно сюда добавить, так это какую-нибудь ORM... допустим, вы правы. возможно ли вообще в таком случае избавиться от дублирования кода? я имею в виду то, что WS и клиент будут дёргать методы WCF-сервиса одинаково и нужно будет один и тот же код писать в двух разных местах. |
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 22 Всего: 118 |
а где я предлагаю использовать WCF?! Я предлагаю вам напрямик создать в своем же процессе экземпляр сервиса и использовать его функции! И только лишь. С этой т.з. "сервис" (который уже не будет сервисом в понимании "сетевой" или "windows nt") будет выступать как Repository для доступа к вашей базе Это сообщение отредактировал(а) jonie - 3.8.2011, 12:36 -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| resiork |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 2.8.2011 Репутация: нет Всего: нет |
прошу отнестись терпимее к моим постам, пусть даже и вопросы слегка нубовские.
просто в книгах про такое не пишут (нарушает ли создание экземпляра сервиса непосредственность в работе с базой), а вживую обсудить не с кем, к сожалению. есть только текст задачи, уточнить который не представляется возможным. вот и остаётся надежда на форумы. попробую сделать так, как вы предлагаете. но вопрос ещё один всё же возникает. является ли корректным с т.з. архитектуры использование аж целого экземпляра сервиса для какого-то доступа к БД? |
|||
|
||||
| jonie |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 22 Всего: 118 |
что значит "целого"?) Жалко чтоли... Вы поймите что я говорю об экземпляре объекта, а не о "сервисе" как таковом. Сервис тут надо читать именно как "нечто что обеспечивает удобный доступ к методам для работы с данными (сервисные функции)". т.е. резюмируя: у вас есть WCF Веб-сервис, который как-то реализуется сервисом class Service1. Этот Service1 реализует инетрфейс IService1. Когда вы генерируете WCF Proxy client вы получаете proxy для работы с Service1, которая также наследует интерфейс IService1. Ничто не мешает вам написать примерно так:
лишь бы только доступны были сборки нужные. Собственно всё - в строке два веб-сервис перестает существовать и вы получаете просто "теже яйца, только без WCF" (выделенное важно). На самом деле вы даже перестаете знать работает ли клиент с удаленныой веб службой или обращается локально к сервису... и тем более клиент не видит никаких сложностей для работы с базой, т.к. о ее наличии он ничего не знает (она скрата за сервисом). Это сообщение отредактировал(а) jonie - 3.8.2011, 13:28 -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
||||
|
|||||
| resiork |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 2.8.2011 Репутация: нет Всего: нет |
спасибо за доходчивое объяснение
тогда осталось добить вот этот вопрос: |
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 22 Всего: 118 |
так где дублирование? И на сервере и на клиенте будет одна и таже длл WCF сервис реализующая, которую и будет дергать клиент через интерфейс (см пример выше). "Переключение" будет заключаться в получении конкретного экземпляра либо прокси либо сервиса - что тривиально, вплоть до
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |