Используйте Получить по типу или Получить по идентификатору - PullRequest
2 голосов
/ 06 апреля 2011

У меня есть метод с именем GetObjectsRelatedToAType, например, GetCarsRelatedToDealership.Какой подход лучше с точки зрения сигнатур веб-сервисов или общих методов:

List<Cars> GetCarsRelatedToDealership( Dealership dealership );

или

List<Cars> GetCarsRelatedToDealership( id dealership );

Мне нравится объектный подход, потому что он немного более убедителен,исходные данные для метода действительны.Мысли / советы?

Ответы [ 6 ]

5 голосов
/ 06 апреля 2011

Является ли идентификатор единственным элементом информации, который требуется для работы метода?Если это так, я бы оставил это на этом.

3 голосов
/ 06 апреля 2011

У объектного подхода есть проблемы.

Dealership dealership;
GetCarsRelatedToDealership(dealership); // dealership is null

var dealership = new Dealership();
GetCarsRelatedToDealership(dealership); // dealership has no id

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

При работе со службами я бы создал пару классов запрос / ответ. Это позволяет вам гарантировать, что ваша подпись никогда не должна меняться. Ваши объекты Request или Response могут измениться, но сигнатура метода не изменится.

Теперь я могу передать идентификатор дилера, а также того, кто запрашивает информацию, и убедиться, что запрашивающему пользователю разрешено видеть инвентарь этого дилерского центра. Что-то, проходящее через дилерский центр или удостоверение личности, не позволит.

public class CarsRequest
{
  public int DealershipId { get; set; }
  public int RequesterId { get; set; }
}

public class CarsResponse
{
  public Car[] Cars { get; set; }
}

CarsResponse GetCarsRelatedToDealership(CarsRequest request);
2 голосов
/ 06 апреля 2011

Для веб-сервисов я стараюсь минимизировать объем передаваемых данных по проводам. Если вам также нужен метод, я бы, вероятно, сделал метод-член "GetRelatedCars" для класса / интерфейса "Дилерство". Когда приходит вызов веб-службы, вы можете подтвердить, что это реальное «Дилерство» (и вызывающий абонент имеет права на него), получив этот объект на основе идентификатора и для вызова метода «GetRelatedCars» для объекта.

1 голос
/ 06 апреля 2011

Обычно достаточно использования только идентификатора, и это намного проще, потому что вы можете просто передавать идентификатор из одного места в другое.Это особенно важно для веб-сервисов, где вы хотите минимизировать объем передаваемых данных.

Однако, если у вас часто есть большие сигнатуры метода, когда входные данные не очень хорошо указаны именем метода:

List<Cars> GetCars(int makeId, int modelId, int year, int dealershipId);

... это может стать очень простым для передачинеправильный идентификатор в неправильном месте.С этого момента я бы начал пытаться найти другую стратегию.Строго вводить входные данные как доменные объекты - это одно из решений, но, как правило, это доставит вам гораздо больше хлопот, чем простое использование специальных опций POCO:

public class GetCarsOptions
{
    public int MakeId {get;set;}
    public int ModelId {get;set;}
    public int Year {get;set;}
    public int DealershipId {get;set;}
}

List<Cars> GetCars(GetCarsOptions options)
{
    ValidateOptions(options); // make sure the values all make sense.
}

На самом деле вы не сможете пойматьКаждая возможная ошибка во время выполнения, поэтому рекомендуется объединить автоматизированные тесты с методами «fast-fast», чтобы попытаться выявить как можно больше ошибок после компиляции и перед развертыванием.

1 голос
/ 06 апреля 2011

Я бы пошел с подходом Id и подтвердил, что Id действителен.Вы потенциально можете получить недопустимый объект для дилеров, и в этом случае не будет никакого преимущества при использовании Dealership

1 голос
/ 06 апреля 2011

Можете ли вы сделать так, чтобы метод брал интерфейс?Это сделало бы его более гибким и, возможно, более легким для тестирования.

List<Cars> GetCarsRelatedToDealership( IDealership dealership );
...