У меня есть библиотека классов, которую я хочу предоставить внешнему миру как службу WCF. Мой класс содержит абстрактные классы, обычные классы, перечисления и т. Д.

Я просто хочу, чтобы люди могли сделать "служебную ссылку" на мою библиотеку классов в своем проекте и начать ее использовать.

Как мне этого добиться?

2
Bhaskar 14 Авг 2009 в 13:13
... а какой у вас вопрос?
 – 
Rune Grimstad
14 Авг 2009 в 13:14
@All: Я думаю, это реальный вопрос, только немного запутался. OP, похоже, считает, что раскрытие его библиотеки классов будет иметь тот же эффект, что и предоставление его клиентам копии библиотеки классов. Тем не менее, он раньше использовал «Добавить ссылку на службу» и видит, что он этого не делает. Он хочет знать, что он сделал не так.
 – 
John Saunders
14 Авг 2009 в 13:41

3 ответа

Лучший ответ

Если вы еще не закончили, то можете спасти себя от большой ошибки, не начав.

Библиотека классов разработана как библиотека классов. Услуга создана как услуга. Это две разные вещи с разными целями.

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

Ничто из этого не имеет смысла раскрывать в сервисе!

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

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

Очевидно, что клиент Java не будет использовать те же типы .NET, которые используются в ваших серверных операциях!

Стандартный способ создания .NET-клиента работает точно так же - через прокси-классы. Ваш вопрос предполагает, что вы ожидаете, что при открытии библиотеки классов фактические классы будут экспортированы клиенту. Это не относится к делу. Если вы решите связать клиента с конкретными классами .NET, используемыми сервером, тогда клиентам потребуется сборка на стороне сервера, как если бы клиенты использовали обычную библиотеку классов.

2
John Saunders 14 Авг 2009 в 13:39
Большое спасибо, это определенно имеет смысл.
 – 
Bhaskar
14 Авг 2009 в 14:14
Я знаю, что опоздал на 3 года, но, надеюсь, вы увидите это сообщение. Если бы вам пришлось присоединить сборку к службе для выполнения всего вашего поведения типа POCO, как бы вы затем отправили аналогичный объект обратно клиенту для использования? Просто создать в интерфейсе объект с атрибутом света и передавать его туда и обратно для изменения? Или есть другая практика? Я застрял в этой ситуации, когда мне нужно использовать библиотеку для вещей, которые ДОЛЖНЫ быть в службе. Я ищу здесь какую-то передовую практику.
 – 
Sinaesthetic
23 Май 2012 в 18:39
@Sinaesthetic: вам нужно задать вопрос. Это сайт вопросов и ответов, а не дискуссионный форум.
 – 
John Saunders
23 Май 2012 в 18:42
В подобных ситуациях, когда у меня обычно есть закрытые вопросы, помеченные как «повторяющиеся». Я подумал, что будет проще спросить в этом посте, поскольку он напрямую связан с этим OP.
 – 
Sinaesthetic
23 Май 2012 в 18:55
@Sinaesthetic: спрашивать в комментарии хуже.
 – 
John Saunders
23 Май 2012 в 19:02

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

Для перечислений вам нужно будет добавить атрибут [EnumMember], например:

public enum Sex
{
    [EnumMember]
    Unknown,
    [EnumMember]
    Male,
    [EnumMember]
    Female
}

Тем не менее, тема WCF слишком широка, чтобы охватить ее здесь. Просто посмотрите, что произойдет, и если у вас возникнут проблемы, задавайте более конкретные вопросы.

1
Thorarin 14 Авг 2009 в 13:30
Каким будет метод bindinf, будет ли это wsHttpBinding или nrtTcpBinding. Не могли бы вы предоставить несколько ссылок, которые могли бы помочь мне в этом.
 – 
Bhaskar
14 Авг 2009 в 13:34