При предоставлении метода бизнес-логики для получения объекта домена должен ли параметр принимать объект или идентификатор? Например, мы должны сделать это:
public Foo GetItem(int id) {}
или это:
public Foo GetItem(Foo foo) {}
Я верю в передачу объектов вокруг, в целом, но как насчет того случая, когда мы получаем объект, и мы знаем только идентификатор? Должен ли вызывающий объект создать пустой Foo и установить идентификатор, или он должен просто передать идентификатор методу? Поскольку входящий Foo будет пустым, за исключением идентификатора, я не вижу преимущества вызывающей стороны в необходимости создания Foo и установки его идентификатора, когда он может просто отправить идентификатор в метод GetItem ().
источник
Будет ли это происходить по проводам (сериализованным / десериализованным) в любое время сейчас или в будущем? Отдавайте предпочтение одному типу идентификатора над полным объектом «кто знает, как».
Если вы ищете безопасность типов идентификатора для его объекта, то также есть решения для кода. Дайте мне знать, если вам нужен пример.
Изменить: расширение на тип безопасности ID:
Итак, давайте возьмем ваш метод:
Мы только надеемся ,
id
что переданное целое число - дляFoo
объекта. Кто-то может использовать его неправильно и передатьBar
целочисленный идентификатор какого-либо объекта или просто ввести его вручную812341
. Это небезопасноFoo
. Во-вторых, даже если вы использовали передачуFoo
версии объекта , я уверен, чтоFoo
есть поле идентификатора,int
которое кто-то может изменить. И наконец, вы не можете использовать перегрузку методов, если они существуют в классе вместе, так как меняется только тип возвращаемого значения. Давайте немного перепишем этот метод, чтобы он выглядел безопасным для типов в C #:Итак, я ввел класс с именем,
IntId
который имеет общий элемент. В этом конкретном случае я хочу,int
чтобы это было связаноFoo
только с. Я не могу просто пройти голымint
и не могу назначитьIntId<Bar>
его случайно. Ниже показано, как я написал эти безопасные для типов идентификаторы. Обратите внимание, что манипулирование фактическим базовым объектомint
осуществляется только на уровне доступа к данным. Все, что выше этого, видит только сильный тип и не имеет (прямого) доступа к своему внутреннемуint
идентификатору. У него не должно быть оснований.Интерфейс IModelId.cs:
Базовый класс ModelIdBase.cs:
IntId.cs:
и, для полноты моего кода, я также написал один для объектов GUID, GuidId.cs:
источник
Origin
свойство: оно очень похоже на схему на языке SQL Server. Возможно, у вас есть программное обеспечение,Foo
которое используется в вашем бухгалтерском программном обеспечении, и другоеFoo
, предназначенное для управления персоналом, и это небольшое поле существует, чтобы отличать их на уровне доступа к данным. Или, если у вас нет конфликтов, игнорируйте это, как и я.Я конечно согласен с вашим выводом. Передача идентификатора является предпочтительной по нескольким причинам:
Foo
объекта только для идентификатора означает создание ложных значений. Кто-то может ошибиться и использовать эти значения.int
более платформенный и может быть объявлен изначально на всех современных языках. Чтобы создатьFoo
объект с помощью метода, вызывающего метод, вам, вероятно, потребуется создать сложную структуру данных (например, объект json).источник
Я думаю, что было бы разумно установить поиск по идентификатору объекта, как предложил Бен Фойгт.
Однако помните, что тип идентификатора вашего объекта может измениться. Таким образом, я бы создал класс идентификатора для каждого из моих элементов и разрешил бы поиск элементов только через эти экземпляры этих идентификаторов. Смотрите следующий пример:
Я использовал инкапсуляцию, но вы также можете
Item
наследовать отItemId
.Таким образом, если тип вашего идентификатора меняется по дороге, вам не нужно ничего менять в
Item
классе или в сигнатуре метода GetItem. Только при реализации сервиса вам придется изменить свой код (который в любом случае меняется только во всех случаях)источник
Это зависит от того, что делает ваш метод.
Вообще-то, для
Get methods
здравого смысла передатьid parameter
и вернуть объект обратно. В то время как для обновления илиSET methods
вы бы отправили весь объект для установки / обновления.В некоторых других случаях, когда вы
method is passing search parameters
(как набор отдельных примитивных типов) извлекаете набор результатов, это может быть целесообразным дляuse a container to hold
ваших параметров поиска. Это полезно, если в долгосрочной перспективе количество параметров изменится. Таким образом, выwould not need
должны изменитьsignature of your method, add or remove parameter in all over the places
.источник