powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Как возвращать кастомные статус коды совместо с кастомными типами?
19 сообщений из 19, страница 1 из 1
Как возвращать кастомные статус коды совместо с кастомными типами?
    #39174959
Leo11Nardo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня есть такой сервис

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
[ServiceContract]
public interface IService
{
    [OperationContract]
    void Initialize();

    [OperationContract]
    Settings GetSettings(); // returns custom type Settings

    [OperationContract]
    void SetSettings(Settings settings);

    [OperationContract]
    bool SettingsAccepted();
}



Хочу возвращать кастомные сообщения о состоянии сервиса типа таких

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
[DataContract]
public enum ServiceStatus
{
    [EnumMember]
    NormalWork = 0,

    [EnumMember]
    TimeOut,

    [EnumMember]
    DenialOfService
};



Но хочу это делать примерно так (тип возврата - псевдокод)

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
[ServiceContract]
public interface IService
{
    [OperationContract]
    (ServiceStatus) Initialize();

    [OperationContract]
    (ServiceStatus, Settings) GetSettings();

    [OperationContract]
    (ServiceStatus) SetSettings(Settings settings);

    [OperationContract]
    (ServiceStatus, bool) SettingsAccepted();
}



Логика на клиенте будет примерно такая: проверить ServiceStatus возвращаемого значения, и если он ServiceStatus.NormalWork, то делать что-то с остальной частью возвращаемого значения.

Как лучше всего это организовать - возврат кастомных сообщений совместно с другими данными?

Вообще, вопрос звучит более широко - как вообще возвращать из сервиса много разнотиповых данных за раз. Если бы можно было делать как в псевдокоде - возвращать (ServiceStatus, Settings) - то проблем бы не было. Но вернуть можно вроде как только одно значение.

Надо для возврата городить некий базовый класс со свойством ServiceStatus и наследовать от него другие классы возврата для каждого OperationContract? Но ведь это какая-то глупость?
...
Рейтинг: 0 / 0
Как возвращать кастомные статус коды совместо с кастомными типами?
    #39174961
Leo11Nardo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И похоже, что возвращать можно только одно значение - это ограничение не инфраструктуре WCF, а языка C# - в нём тоже у методов только одно возвращаемое значение, если не принимать во внимание всякие костыли типа ref и out.
...
Рейтинг: 0 / 0
Как возвращать кастомные статус коды совместо с кастомными типами?
    #39175201
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leo11Nardo, Domain объект. Tuple еще как вариант, но не советую
...
Рейтинг: 0 / 0
Как возвращать кастомные статус коды совместо с кастомными типами?
    #39175574
Leo11Nardo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне посоветовали две вещи.

В одном случае предлагают сделать дженерик в дата контракте:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
[DataContract]
public class ServiceResponse<T>
{
  [DataMember]
  ServiceStatus Status { get; set; }

  [DataMember]
  T Payload { get; set; }
}



и в контракте операции указать конкретный тип этого дженерика

Код: c#
1.
2.
[OperationContract]
ServiceResponse<bool> SettingsAccepted();



А в другом случае предлагают все статусы через исключения возвращать.

Я вот думаю, что исключения вроде как для ошибок предназначены - нормально ли через исключения сообщать клиентам о разных этапах НОРМАЛЬНОЙ работы службы?
...
Рейтинг: 0 / 0
Как возвращать кастомные статус коды совместо с кастомными типами?
    #39175578
Leo11Nardo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т. е. наделать разных типов исключений на каждый статус и вызывать эти исключения при переключении статуса.

У меня статус, например, DenialOfService больше говорит не о возникновении какой-то ошибки на стороне сервера, а о завершении конкретной работы и отказе в обслуживании, если будут повторные запросы по этой работе. Но работа завершилась нормально, без ошибок.

Но есть и другие статусы, где вообще всё ОК и работа продолжается - тут-то причём исключения?

Вообще, общаться исключениями - плохая ли практика?
...
Рейтинг: 0 / 0
Как возвращать кастомные статус коды совместо с кастомными типами?
    #39175583
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leo11NardoВ одном случае предлагают сделать дженерик в дата контракте:
Не рекомендуется использовать дженерики в WCF.
...
Рейтинг: 0 / 0
Как возвращать кастомные статус коды совместо с кастомными типами?
    #39175617
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leo11Nardo,

Сколько людей - столько мнений. Если варианты собираешь, то вот еще один:
Обращаешься сначала к одному методу, в зависимости от ответа - к другому за уточнением...
Затем к третьему, если надо... и т.д.

А так есть DTO, Агрегаты, и еще куча всего. Делай так, как нравится. Придумай что-то свое... Нет на твой вопрос однозначного ответа. В любом решении будут преимущества и недостатки...
...
Рейтинг: 0 / 0
Как возвращать кастомные статус коды совместо с кастомными типами?
    #39175734
Leo11Nardo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronLeo11NardoВ одном случае предлагают сделать дженерик в дата контракте:
Не рекомендуется использовать дженерики в WCF.
Это где такое написано и почему?

refregLeo11Nardo,

Сколько людей - столько мнений. Если варианты собираешь, то вот еще один:
Обращаешься сначала к одному методу, в зависимости от ответа - к другому за уточнением...
Затем к третьему, если надо... и т.д.

А так есть DTO, Агрегаты, и еще куча всего. Делай так, как нравится. Придумай что-то свое... Нет на твой вопрос однозначного ответа. В любом решении будут преимущества и недостатки...
Это да.
...
Рейтинг: 0 / 0
Как возвращать кастомные статус коды совместо с кастомными типами?
    #39175735
Leo11Nardo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refregLeo11Nardo,

Сколько людей - столько мнений. Если варианты собираешь, то вот еще один:
Обращаешься сначала к одному методу, в зависимости от ответа - к другому за уточнением...
Затем к третьему, если надо... и т.д.
По-моему, это в посте, помеченном как ответ, вот здесь написано https://social.msdn.microsoft.com/Forums/vstudio/en-US/79585667-6b97-4ce4-93fa-3a4dcc7a9b86/wcf-and-generics?forum=wcf
Или что-то подобное. И по-моему, это гораздо более монструозное и непонятное решение, чем "ограниченные дженерики".
...
Рейтинг: 0 / 0
Как возвращать кастомные статус коды совместо с кастомными типами?
    #39175736
Leo11Nardo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно, попробую ограниченные дженерики для начала. Пока единственный "минус", что я слышал против них - "надо делать два типа проверок на стороне клиента - обработка исключений и обработка статус кодов". Вообще, это было не против дженериков, а против статус кодов. Так что против конкретно дженериков я пока ничего толком не услышал.
...
Рейтинг: 0 / 0
Как возвращать кастомные статус коды совместо с кастомными типами?
    #39176180
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все советы в небо...
...
Рейтинг: 0 / 0
Как возвращать кастомные статус коды совместо с кастомными типами?
    #39176212
Leo11Nardo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronВсе советы в небо...
Ну а какие аргументы против дженериков?

И что за
AxeleronDomain объект.
...
Рейтинг: 0 / 0
Как возвращать кастомные статус коды совместо с кастомными типами?
    #39176213
Leo11Nardo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Также непонятно, что за
refregDTO, Агрегаты
в контексте заданного мной вопроса.

В принципе, у меня и так DTO возвращается - вот хотя бы этот

Leo11Nardocustom type Settings

Это спецовский объект, который создаётся у меня из домееного объекта Settings. Т. е. я не сам доменный объект настроек передаю, а перевожу его в DTO с атрибутом DataContract. Ну и на клиенте он в клиентский объект настроек превращается - всё по слоям, как у взрослых.

Только я не пойму, как мне это DTO или доменный объект поможет вернуть ещё и статусный код.
...
Рейтинг: 0 / 0
Как возвращать кастомные статус коды совместо с кастомными типами?
    #39176375
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leo11NardoЭто спецовский объект, который создаётся у меня из домееного объекта Settings. Т. е. я не сам доменный объект настроек передаю, а перевожу его в DTO с атрибутом DataContract. Ну и на клиенте он в клиентский объект настроек превращается - всё по слоям, как у взрослых.

Только я не пойму, как мне это DTO или доменный объект поможет вернуть ещё и статусный код. Смотри на свой сервис глазами клиента - нужен ему статус - вставь статус в DTO. Какие проблемы?
...
Рейтинг: 0 / 0
Как возвращать кастомные статус коды совместо с кастомными типами?
    #39181648
Leo11Nardo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refreg, Axeleron

Да нет. Вы, наверное, не поняли меня. Ну помещю я код статуса в базовый DTO:

Код: c#
1.
2.
3.
4.
5.
6.
[DataContract]
public class ServiceResultBase
{
	[DataMember]
	public ServiceStatus Status { get; set; }
}



Но как потом вернуть что-то, помимо этого статуса, но вместе с ним? Придётся городить иерархию классов DTO на каждый тип:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
[DataContract]
public class ServiceResult_Settings : ServiceResultBase
{
	[DataMember]
	public Settings Settings { get; set; }
}

[DataContract]
public class ServiceResult_SettingsAccepted : ServiceResultBase
{
	[DataMember]
	public bool SettingsAccepted { get; set; }
}



Между тем, отвечая на акселероновское "Не рекомендуется использовать дженерики в WCF.". Где об этом написано. Вы бы хоть ссылку дали или своими словами сказали, что не там с дженериками. Потому что МСДН говорит, что с ними всё нормально:

https://msdn.microsoft.com/en-us/library/ms733127(v=vs.110).aspx

Код: c#
1.
Generic types are handled in exactly the same way as non-generic types. There are no special requirements for generic parameters. For example, consider the following type.


И далее там ещё пара слов по этому поводу.

Может, вы когда-то давно с этим дело имели и тогда в WCF были проблемы с дженериками? Я сейчас .NET 4.5 использую и для этой версии в МСДНе нет против дженериков ничего. Просто надо на каждый тип Т тоже DataMember поставить и чтобы он сериализоваться мог, иначе при десериализации будут null-овые поля, как я понимаю. Это и есть та проблема, о которой Акселерон говорит?
...
Рейтинг: 0 / 0
Как возвращать кастомные статус коды совместо с кастомными типами?
    #39181652
Leo11Nardo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скажите, чем этот вариант плох?
...
Рейтинг: 0 / 0
Как возвращать кастомные статус коды совместо с кастомными типами?
    #39181674
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leo11Nardo, почитайте здесь , например, если понимаете английский.
...
Рейтинг: 0 / 0
Как возвращать кастомные статус коды совместо с кастомными типами?
    #39184430
Leo11Nardo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronLeo11Nardo, почитайте здесь , например, если понимаете английский.
Т. е. если сравнивать два подхода: 1) по классу на возвращаемый сервисом тип, 2) "ограниченный дженерик" на возвращаемый сервисом тип, то они будут различаться вот чем:

1) на сервере объявляется один дженерик-класс, на клиенте - столько классов, сколько типов у параметра Т дженерика;

2) на сервере объявляется столько классов, сколько типов хочу возвратить, и на клиенте то же самое.

Это первое отличие.

Второе отличие. По сути, мне в любом случае придётся на клиенте держать логику разбора ответов сервиса по каждому типу отдельно. Только в случае 2) я могу воспользоваться базовым классов возврата и использовать KnownType, если надо.



Т. е. вы против дженериков и за иерархию типов возврата с KnownType и разными резолверами ?
...
Рейтинг: 0 / 0
Как возвращать кастомные статус коды совместо с кастомными типами?
    #39184432
Leo11Nardo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leo11NardoKnownType
И плюс ServiceKnownType.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Как возвращать кастомные статус коды совместо с кастомными типами?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]