2012-03-05 2 views
0

Хорошо, поэтому я создал свой сервис WCF и его функционирование отлично! Тем не менее, я начинаю внедрять его в нашу ранее существовавшую часть программного обеспечения, и я сразу же сталкиваюсь с вопросом, я использую только прокси-сгенерированный код и избавляюсь от используемой мной библиотеки dll? Или я держу оба, и делаю различия между ними очень очевидными?WCF другая лучшая практика?

Что я имею в виду, сохраняя различия, имея свойство ServerUser и свойство LocalUser, которые представляют один и тот же объект пользователя. Однако мое свойство LocalUser будет заполнено через DLL, с которой приложение было запущено, если служба приложения недоступна.

Мое главное обоснование этого шаблона мысли заключается в том, что если я удалю свою dll, у меня будет одна точка отказа. Если по какой-то причине мой ServiceHost просто не работает и работает, но сервер БД, я бы хотел, чтобы мои пользователи все еще могли выполнять свою работу. Функции, которые использует новая реализация WCF, не зависят от того, как сотрудники выполняют свою работу. Это более удобно в том, что предоставляет служба WCF. Кроме того, построение такой логики для Сервиса позволило бы более легко получить модификации служб в среде, не содержащей IIS.

Кроме того, есть ли способ построить логику на службе, чтобы, когда я вытаскиваю прокси-код для клиента, который просто знает, чтобы получить доступ к БД вручную, если ServiceHost недоступен? Если бы это было возможно, я думаю, что около 90% всех моих проблем исчезнут.

Спасибо заранее!

+0

Я думаю, мне нужна дополнительная информация, чтобы дать хороший ответ, но я не думаю, что это хорошая идея иметь два пути (непосредственно к БД и через службу) - использовать службу только и скрыть слой DB – Carsten

+1

Вы всегда можете предоставить созданный вручную прокси-сервер, который может делать все, что вы хотите. –

ответ

1

Из того, что вы описываете, это похоже на сохранение вашей существующей DLL, то есть прямой доступ к БД, наилучшим образом соответствует вашим потребностям. Если служба WCF ничего не добавляет, если в случае сбоя вы все равно будете использовать DLL.

В идеале вы должны пойти с сервисом WCF полностью и предложить некоторую избыточность для решения любых проблем с потенциальными сервисами. Кроме того, использование сервиса означает, что вам не придется иметь дело с обновлениями/развертываниями DLL.

Но, исходя из вашего вопроса, похоже, что будут какие-то реальные проблемы, с которыми нужно иметь дело, если служба не будет доступна, так что просто с DLL.

EDIT: Просто прочитайте последнюю часть своего вопроса, и я не думаю, что это возможно. Прокси-код для доступа к службам создается при добавлении ссылки на ваш проект. Тип «динамической» информации, на которой вы находитесь, действительно потребует услуги.

EDIT: В соответствии с моим комментарием ниже вы можете протестировать это, создав DLL и класс, и позвоните ему Class1. Затем создайте службу WCF с помощью метода, который возвращает Class1. Создайте клиентское приложение и добавьте ссылку на службу. Если вы посмотрите на код, созданный с помощью прокси-сервера, вы должны увидеть (надеюсь ... я думаю об этом при вводе :)), что метод возвращает Class1, но когда вы его компилируете, он не сможет найти Class1. Это связано с тем, что Class1 не имеет DataContractAttribute, который автоматически генерирует Class1 на клиенте. Таким образом, вы должны распространять общую DLL для клиента. Теперь, когда метод возвращается, и WCF пытается воссоздать Class1, он будет использовать локальную версию в общей DLL. Ваша другая DLL, которая уже будет на клиенте, будет использовать одну и ту же общую DLL.

+0

Позвольте мне спросить вас об этом, есть ли простой способ сделать это так, чтобы клиентское приложение могло легко интерпретировать объекты, возвращающиеся из службы или библиотеки dll? Например, AppNamespace.Data.MyMethod возвращает List однако служба возвращает обратно List . Несмотря на то, что они являются тем же самым объектом, его запутали, поскольку он не находится в пределах одного пространства имен. – meanbunny

+1

Возможно, если у вас есть общая библиотека DLL с классами, используемыми как DLL, так и службой. Если у вас был метод службы, который возвращал класс из общей DLL, например AClass MyMethod(), тогда прокси-код выглядел бы точно так же на стороне клиента, потому что вы возвращали бы фактический класс, а не Data Контракт, т.е. класс не будет автоматически сгенерирован, поэтому клиентская сторона будет ожидать, что класс будет найден локально в общей DLL. Ваша DLL также будет использовать одну и ту же общую DLL. Таким образом, как DLL, так и служба будут ссылаться на классы в одном и том же, совместно используемом местоположении. – MotoSV

+0

Хорошо, да, к концу моего дня сегодня я смог приблизиться. Я думаю, что мой следующий шаг, если это будет возможно, - добавить ссылку на мою службу в мою data.dll, чтобы все мои операторы данных были объединены в один пакет для использования клиентом или сервером. Я пытаюсь сделать это как можно более многоразовым и достаточно простым, чтобы следующий парень пришел за мной, чтобы иметь возможность пикапа. Спасибо за ваше время. Вы все в stackoverflow, как мои коллеги, отскакивают от причины здесь, у меня их нет. – meanbunny