у меня есть два веб-сервиса. Один с пользовательской функциональностью, один с администраторской функциональностью.
Оба сервиса эффективно работают с теми же типами объектов, например:
Теперь в клиенте у меня есть две сервисных ссылки, Веб-сервисы. Администратор и Веб-сервисы. Пользователь.
Если я использую UserService для получения Клиентских объектов, я не могу управлять объектами через AdminService, так как UserService получает объекты Веб-сервисов типа. Пользователь. Клиент, однако AdminService работает с объектами Веб-сервисов типа. Администратор. Клиент.
На стороне сервера оба типа идентичны, просто принадлежат различным пространствам имен в клиенте.
Теперь вопрос: Как я могу совместно использовать типы через различные сервисные ссылки?
Используйте 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
Проблема в том, что вы итерируете генераторы вместо списков в варианте выхода, а именно 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, вы можете сделать это:
Если это сделать, при добавлении ссылок на службу WCF будет находить и использовать эту общую сборку, а не создавать новые типы для сущностей. В вашем случае у вас будет только один тип контрактов. Клиент
или с чем бы вы ни имели дело.
Это работает только , если вы управляете обоими концами провода и используете .NET на обоих концах! Но в этом случае это отличный способ обмена контрактами - особенно контрактами на передачу данных - как между сервером, так и между любым количеством клиентов.