Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужна помощь с архитектурой приложения, Работа с БД + расширяемая архитектура 
:(
    Опции темы
resiork
Дата 3.8.2011, 06:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 2.8.2011

Репутация: нет
Всего: нет



Есть клиентское приложение MVVM (WPF+C#), которое работает с БД (MSSQL) через одно из двух расширений (Add-In, MAF).
Первое расширение предоставляет доступ к БД через серверную прослойку в виде WindowsService, второе расширение- подключается напрямую к SQL-серверу. Приложение может переключать расширения (выбирать источник данных) "на лету".

Вопрос в следующем: как будет правильнее всего организовать переключение источников данных на лету?

Мои мысли:
1. Оба расширения должны наследоваться от одного класса (какой-нибудь DataDriver) или реализовывать общий интерфейс, а при активации расширения в экземпляре клиента будет выполняться что-что типа:
Код

DataDriver driver;
...
// активизация расширения
...
// замена источника данных
driver = activeAddIn;

2. Так как серверная прослойка (WS) и второе расширение будут использовать одинаковый код для доступа к данным, нужно этот повторно используемый код обернуть в подходящий шаблон (скорее всего). Пытался обойтись наследованием или композицией, всё равно возникают куски повторяющегося кода.

PM MAIL   Вверх
jonie
Дата 3.8.2011, 08:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



а одно приложение нельзя писать? Все через wcf и делать, а если надо коннект можно сделать локальным (на self-hosted wcf) через пайпы....


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
resiork
Дата 3.8.2011, 08:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 2.8.2011

Репутация: нет
Всего: нет



jonie, не, одно нельзя. Вся суть в том, чтобы сделать всё именно в таком виде, как написано.

Дополнение: клиентская прога, кстати, с WindowsService по WCF общается.
PM MAIL   Вверх
jonie
Дата 3.8.2011, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



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

в одном случае вы будете работать с wcf proxy, в другом - с ссылкой на экземпляр "сервиса"....




--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
resiork
Дата 3.8.2011, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 2.8.2011

Репутация: нет
Всего: нет



jonie, я верю вам, что геморрой smile
но задача поставлена именно так:
Цитата

1. Приложение должно состоять из:
- клиент (WPF);
- сервер (WS);
- БД (MSSQL).
2. Связь м\у клиентом и сервером через WCF.
3. Приложение должно работать как с сервером, так и с базой напрямую с возможностью переключения на лету. Эта возможность должна быть реализована через систему плагинов.

и обсуждению это не подлежит. Ни при каких условиях.
так что, нужно просто поработать с тем, что есть, каким бы геморроем это не сулило smile
PM MAIL   Вверх
jonie
Дата 3.8.2011, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



resiork, ну и где вы видете запрет на использование клиентом кода WCF сервиса напрямую (без собственно wcf - путем создания экземпляра класса, реализующего wcf сервис)?


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
resiork
Дата 3.8.2011, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 2.8.2011

Репутация: нет
Всего: нет



jonie, а разве фраза "с базой напрямую" предполагает использование прокладки в виде WCF?
если так, то задача упрощается smile
но, по-моему, WCF в этом месте использовать не нужно, хотя и очень хочется, и максимум, что можно сюда добавить, так это какую-нибудь ORM...
допустим, вы правы. возможно ли вообще в таком случае избавиться от дублирования кода? я имею в виду то, что WS и клиент будут дёргать методы WCF-сервиса одинаково и нужно будет один и тот же код писать в двух разных местах.
PM MAIL   Вверх
jonie
Дата 3.8.2011, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



Цитата(resiork @  3.8.2011,  13:19 Найти цитируемый пост)
jonie, а разве фраза "с базой напрямую" предполагает использование прокладки в виде WCF?
если так, то задача упрощается smile

а где я предлагаю использовать WCF?! Я предлагаю вам напрямик создать в своем же процессе экземпляр сервиса и использовать его функции! И только лишь.

 С этой т.з. "сервис" (который уже не будет сервисом в понимании "сетевой" или "windows nt") будет выступать как Repository для доступа к вашей базе

Это сообщение отредактировал(а) jonie - 3.8.2011, 12:36


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
resiork
Дата 3.8.2011, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 2.8.2011

Репутация: нет
Всего: нет



прошу отнестись терпимее к моим постам, пусть даже и вопросы слегка нубовские.
просто в книгах про такое не пишут (нарушает ли создание экземпляра сервиса непосредственность в работе с базой), а вживую обсудить не с кем, к сожалению. есть только текст задачи, уточнить который не представляется возможным.
вот и остаётся надежда на форумы.
попробую сделать так, как вы предлагаете. но вопрос ещё один всё же возникает.
является ли корректным с т.з. архитектуры использование аж целого экземпляра сервиса для какого-то доступа к БД?
PM MAIL   Вверх
jonie
Дата 3.8.2011, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



Цитата(resiork @  3.8.2011,  14:02 Найти цитируемый пост)

является ли корректным с т.з. архитектуры использование аж целого экземпляра сервиса для какого-то доступа к БД? 

что значит "целого"?) Жалко чтоли... Вы поймите что я говорю об экземпляре объекта, а не о "сервисе" как таковом.
Сервис тут надо читать именно как "нечто что обеспечивает удобный доступ к методам для работы с данными (сервисные функции)".

т.е. резюмируя: у вас есть WCF Веб-сервис, который как-то реализуется сервисом class Service1. Этот Service1 реализует инетрфейс IService1.
Когда вы генерируете WCF Proxy client вы получаете proxy для работы с Service1, которая также наследует интерфейс IService1.
Ничто не мешает вам написать примерно так:
Код

IService1 serviceProxyClient = new ServiceReference1.Service1Client();
IService1 serviceReference = new Service1();

лишь бы только доступны были сборки нужные. 
Собственно всё - в строке два веб-сервис перестает существовать и вы получаете просто "теже яйца, только без WCF" (выделенное важно).

На самом деле вы даже перестаете знать работает ли клиент с удаленныой веб службой или обращается локально к сервису... и тем более клиент не видит никаких сложностей для работы с базой, т.к. о ее наличии он ничего не знает (она скрата за сервисом).

Это сообщение отредактировал(а) jonie - 3.8.2011, 13:28


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
resiork
Дата 3.8.2011, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 2.8.2011

Репутация: нет
Всего: нет



спасибо за доходчивое объяснение smile

тогда осталось добить вот этот вопрос:
Цитата(resiork @  3.8.2011,  12:19 Найти цитируемый пост)

возможно ли вообще в таком случае полностью избавиться от дублирования кода? я имею в виду то, что WS и клиент будут дёргать методы WCF-сервиса одинаково и нужно будет один и тот же код "дёрганья" писать в двух разных местах. 

PM MAIL   Вверх
jonie
Дата 3.8.2011, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



Цитата(resiork @  3.8.2011,  14:49 Найти цитируемый пост)

возможно ли вообще в таком случае полностью избавиться от дублирования кода? я имею в виду то, что WS и клиент будут дёргать методы WCF-сервиса одинаково и нужно будет один и тот же код "дёрганья" писать в двух разных местах. 

так где дублирование? И на сервере и на клиенте будет одна и таже длл WCF сервис реализующая, которую и будет дергать клиент через интерфейс (см пример выше).
"Переключение" будет заключаться в получении конкретного экземпляра либо прокси либо сервиса - что тривиально, вплоть до 
Код

IService GetClient() {
 if(g_isServiceMode) return new ServiceReference1.ServiceProxy();
 else return new Service1();
}



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0519 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.