2010-01-07 3 views
3

Мне нужно создать проект для нескольких веб-сервисов с использованием WCF в C#. Веб-службы будут вызывать другие сборки для выполнения основной обработки. В сборках будут доступны данные из SQL Server. Один из параметров, который будет частью каждого метода веб-службы, будет включать в себя базу данных для использования. Моя проблема заключается в том, как передать параметр базы данных в сборку для использования. Я не могу изменить все подписи для всех спутниковых сборок. Я хочу ссылаться на какую-то переменную, которую собирает спутник. Те же спутниковые сборки используются с приложением Windows Forms и приложением ASP.NET, поэтому мне нужно будет иметь что-то, что могут использовать все типы приложений. Статические поля не подходят, поскольку для одного вызова веб-службы база данных может быть «X», а для другой - «Y». Есть идеи?C# Web Service и с использованием переменной

+2

Ouch. Все, что вы здесь делаете, будет в лучшем случае. Я считаю, что лучше всего начать рефакторинг, используя либеральное разбрызгивание SOA, IoC, возможно, сервисную фабрику, немного более развяжущуюся и бросив еще несколько модных слов. Шутки в сторону. Затем используйте какой-то нумерационный или нейтральный идентификатор для определения того, какой репозиторий данных (база данных) должен использоваться (поскольку веб-сервис должен быть агностиком для того, кто его вызывает). – slugster

+1

Или вы можете просто иметь несколько экземпляров ваших веб-сервисов, по одному для каждого хранилища данных, а затем клиент может просто вызвать соответствующий. Это было бы тривиально до тех пор, пока ваши приложения-клиенты имеют материал webservice, декларативно указанный в своих конфигурационных файлах, - если он жестко закодирован, тогда вы будете завинчены :) – slugster

+0

+1 для рефакторинга и введения IoC et al. Есть ли причина, по которой вы «не можете изменить все подписи»? – Sapph

ответ

2

Это то, что может хорошо сочетаться с каркасом IoC или DI, имеющим некоторый интерфейс, который включает в себя информацию о базе данных, и заставил его вставить всех вызывающих абонентов. Даже без IoC скрытие реализации в интерфейсе звучит как сплошной план.

С вашей static концепции; a [ThreadStatic] может работать, но немного взломан (и вам нужно быть религиозным в отношении очистки данных между абонентами), или другой вариант заключается в том, чтобы скрыть некоторую информацию от Principal, так как это относительно легко настроить как из WCF (для каждого вызова) и winforms (обычно для каждого процесса). В любом случае, будьте осторожны в отношении переключения потоков (async и т. Д.). В частности, обратите внимание, что ASP.NET может изменять потоки в середине конвейера одной страницы.