Проблема с WCF и несколькими пространствами имен - совместное использование типов объектов через несколько сервисных ссылок

у меня есть два веб-сервиса. Один с пользовательской функциональностью, один с администраторской функциональностью.

Оба сервиса эффективно работают с теми же типами объектов, например:

  • AdminService обеспечивает функциональность для удаления/изменения Клиентских объектов
  • UserService обеспечивает функциональность для списка/чтения Клиентских объектов

Теперь в клиенте у меня есть две сервисных ссылки, Веб-сервисы. Администратор и Веб-сервисы. Пользователь.

Если я использую UserService для получения Клиентских объектов, я не могу управлять объектами через AdminService, так как UserService получает объекты Веб-сервисов типа. Пользователь. Клиент, однако AdminService работает с объектами Веб-сервисов типа. Администратор. Клиент.

На стороне сервера оба типа идентичны, просто принадлежат различным пространствам имен в клиенте.

Теперь вопрос: Как я могу совместно использовать типы через различные сервисные ссылки?

5
задан marc_s 10 January 2010 в 20:48
поделиться

2 ответа

Используйте slsvcutil для создания прокси WCF на клиентской стороне (предполагая, что клиентская сторона - это .net приложение), ссылайтесь на DLL, содержащую ваши объекты, и она будет использоваться для всех конечных точек, которые передают один и тот же объект в DLL

Open Visual Studio Command prompt из каталога Start -> Visual Studio 2008 -> Tools -> Visual Command Prompt

goto directory, похожего на

C:\Program Files\Microsoft SDKs\Silverlight\v3. 0\Tools

введите slsvcutil и следуйте синтаксису

slsvcutil http://somewcfservice:8080 /r:CommonLibrary.dll

где CommonLibrary.dll - это dll, содержащая бизнес-объекты

.

[отредактировать] зафиксировал тот факт, что проект является проектом silverlight

1
ответ дан 15 December 2019 в 01:02
поделиться

Проблема в том, что вы итерируете генераторы вместо списков в варианте выхода, а именно second G , который исчерпывается после одного цикла. Измените строку на эту и она работает:

firstG, secondG = f(first), list(f(second))

Или вы можете изменить свой цикл:

for e in ("(%s%s%s)" % (e1, op, e2) for e1 in f(first) for e2 in f(second)):
#                               new generator object every loop  ^^^^^^^^^

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

Помните, что это:

r = [v for a in A for b in B]

эквивалентно:

r = []
for a in A:
  for b in B:
    r.append(v)

Что более ясно показывает повторяющийся цикл над B .

Другой пример:

def y():
  yield 1
  yield 2
  yield 3
def r():
  return [1, 2, 3]

vy = y()
for v in vy:
  print v
for v in vy:
  print v

print "---"

vr = r()
for v in vr:
  print v
for v in vr:
  print v
-121--5044895-

Ну, это легкая победа на SortedList. Для вставки предмета требуется двоичный поиск (O (log (n)), чтобы найти точку вставки, а затем List.Insert (O (n)), чтобы вставить предмет. Доминирует Insert (), для заполнения списка требуется O (n ^ 2). Если входные предметы уже отсортированы, команда Вставить сворачивается в O (1), но не влияет на поиск. Заполнение теперь равно O (nlog (n)). Ты не волнуешься, насколько велик О, сортировка в первую очередь всегда эффективнее. Предполагая, что вы можете позволить себе удвоить потребность в месте хранения.

SortedDictionary отличается, использует красно-черное дерево. Для нахождения точки вставки требуется O (log (n)). После этого может потребоваться повторное выравнивание дерева, которое также занимает O (log (n)). Таким образом, заполнение словаря занимает O (nlog (n)). Использование отсортированного ввода не изменяет усилия по поиску точки вставки или ребалансировки, это все еще O (nlog (n)). Теперь О имеет значение, но вставка отсортированных входных данных требует от дерева постоянного восстановления равновесия. Лучше работать, если входные данные являются случайными, отсортированные входные данные не нужны.

Таким образом, заполнение SortedList отсортированным вводом и заполнение SortedDictionary несортированным вводом имеет значение O (nlog (n)). Игнорируя затраты на предоставление отсортированных входных данных, Oh of SortedList меньше, чем Oh of SortedDictionary. Это деталь реализации из-за того, как List распределяет память. Он должен делать только O (log (n)) раз, красно-черное дерево должно распределять O (n) раз. Очень маленький O btw.

Примечательно, что ни один из них не сравнится с простым заполнением списка, а затем вызовет Sort (). Это также O (nlog (n)). На самом деле, если ввод уже случайно отсортирован, можно обойти вызов Sort (), это сворачивается до O (n). Анализ затрат теперь должен перейти к усилиям, необходимым для сортировки входных данных. Трудно обойти фундаментальную сложность Sort (), O (nlog (n)). Он может быть не виден, входные данные могут быть отсортированы, например, по SQL-запросу. Это займет больше времени.

точкой использования SortedList или SortedDictonary является сохранение сортировки коллекции после вставок. Если вы беспокоитесь только о том, чтобы заселить, но не мутировать, то вы не должны использовать эти коллекции.

-121--1599516-

Если вы контролируете оба конца связи, и оба конца только .NET, вы можете сделать это:

  • положить все ваши контракты, включая ваши контракты данных,в отдельную сборку «Contracts»
  • ссылка на эту сборку как в коде реализации на стороне сервера, так и в коде на стороне клиента

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

Это работает только , если вы управляете обоими концами провода и используете .NET на обоих концах! Но в этом случае это отличный способ обмена контрактами - особенно контрактами на передачу данных - как между сервером, так и между любым количеством клиентов.

1
ответ дан 15 December 2019 в 01:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: