Вопрос

Мы написали веб-сервис, который использует простой переводчик сущностей для сопоставления значений DTO обратно с "реальными" бизнес-объектами на стороне сервера.Как часть этого упражнения.Мы столкнулись с "интересным" различием между явно установленными нулевые значения и клиенты, имеющие не установлено ценность.

Проблема, по сути, заключается в том, что мы хотим установить значение по умолчанию для реального бизнес-объекта если клиент явно не установил значение, однако , используя стандартные типы с нулевым значением , невозможно определить , явно ли клиент имел в виду "установите для этого значение null" или просто не устанавливал его.

Решением здесь, очевидно, является какой-то "флаг".

Внутри бизнес-объекта мы можем отслеживать состояние поля внутренне, используя частные флаги "IsDirty", установленные в установщиках свойств, но DTO на самом деле определяет только интерфейс, поэтому это означает, что эти данные являются общедоступными.Это оставляет несколько вариантов реализации.Язык - C # (то есть статически типизированный), так что...

  1. Мы могли бы выставить флаг "IsSet" для каждого свойства?
  2. Мы могли бы представить каждое свойство как класс, который имеет .Value и .Свойство IsSet?и т.д.и т.д.

Как бы ты решили выставить эти "флаги" в контракте на передачу данных?Что бы вы здесь расценили как наилучшую практику для этого?

Мы были бы весьма признательны за любые мнения по этому поводу.

Это было полезно?

Решение

Использование класса для каждого значения свойства было бы более масштабируемым, чем необходимость объявлять bool для каждого свойства.Это также позволило бы вам выбрать, какие свойства можно оставить пустыми и / или присвоить значение null.

Другие советы

Вы могли бы написать класс, который обертывает флаги данными:

public class DtoData<T> 
{
  T data;
  bool IsSet { get; private set; }
  T Data 
  { 
    get { return data; }
    set { data = value; IsSet = true; } 
  }
}


public class XyzDto 
{
  // only private setters, initialize in constructor
  DtoData<int?> SomeInt { get; private set; }
  DtoData<string> SomeString { get; private set; }
}

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


Лично я бы постарался избежать этой проблемы.Почему "не определено" должно существовать на самом деле?Отправляете ли вы какие-либо различия, неполные DTO или откуда они берутся?Эта проблема может возникнуть с фильтрами, где вам нужна разница, если вы фильтруете поле по null или если вы вообще его не фильтруете.Но для таких сценариев вам в любом случае нужен специальный класс "field-filter".

В общем, то, о чем вы здесь говорите, - это значение по умолчанию, которое отличается от любого значения, которое может установить пользователь.Поэтому просто укажите, что;установите значение по умолчанию, которое не входит в допустимый диапазон значений, которые может установить пользователь.Таким образом, если значение установлено по умолчанию, вы знаете, что оно не было установлено;если значение отличается от этого, вы знаете, что пользователь поработал с ним.Просто потому, что одно из настраиваемых пользователем значений равно null, похоже, сбивает вас с толку;просто считайте, что это одно из множества настраиваемых пользователем значений;сделайте весь диапазон переменной немного большим набором с одним дополнительным значением по умолчанию.Это должно решить вашу проблему.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top