Ao fornecer um método de lógica de negócios para obter uma entidade de domínio, o parâmetro deve aceitar um objeto ou um ID? Por exemplo, devemos fazer isso:
public Foo GetItem(int id) {}
ou isto:
public Foo GetItem(Foo foo) {}
Acredito em passar objetos em sua totalidade, mas e o caso em que estamos obtendo um objeto e conhecemos apenas o ID? O chamador deve criar um Foo vazio e definir o ID, ou deve apenas passar o ID para o método? Como o Foo de entrada estará vazio, exceto o ID, não vejo o benefício do chamador em criar um Foo e definir seu ID quando ele poderia apenas enviar o ID para o método GetItem ().
fonte
Isso vai passar por cima do fio (serializado / desserializado) a qualquer momento agora ou no futuro? Favorecer o tipo de ID único sobre o objeto completo de quem sabe o tamanho.
Se você está procurando a segurança de tipo do ID para sua entidade, também existem soluções de código. Deixe-me saber se você precisar de um exemplo.
Edit: expandindo a segurança de tipo de ID:
Então, vamos usar seu método:
Nós só esperamos que o número inteiro
id
que é passado é para umFoo
objeto. Alguém pode usá-lo mal e passarBar
o ID inteiro de algum objeto ou até digitar manualmente812341
. Não é do tipo seguroFoo
. Em segundo lugar, mesmo se você usou aFoo
versão pass a object , tenho certeza queFoo
possui um campo de ID que éint
alguém que pode ser modificado. E, por último, você não pode usar a sobrecarga de método se eles existirem em uma classe juntos, pois apenas o tipo de retorno varia. Vamos reescrever um pouco esse método para parecer seguro em C #:Então, eu apresentei uma classe chamada
IntId
que tem uma parte genérica. Nesse caso em particular, quero umint
que esteja associadoFoo
apenas. Não posso simplesmente passar nuint
e não posso atribuir umIntId<Bar>
a ele acidentalmente. Então, abaixo, é como escrevi esses identificadores de tipo seguro. Observe que a manipulação do subjacente realint
é apenas na sua camada de acesso a dados. Qualquer coisa acima que veja apenas o tipo forte e não tenha acesso (direto) ao seuint
ID interno . Não deve ter razão para isso.Interface IModelId.cs:
Classe base ModelIdBase.cs:
IntId.cs:
e, para completar a minha base de código, também escrevi um para entidades GUID, GuidId.cs:
fonte
Origin
propriedade: é muito parecido com um esquema na linguagem do SQL Server. Você pode ter umFoo
que é usado em seu software de contabilidade e outroFoo
para Recursos Humanos e esse pequeno campo existe para diferenciá-los na camada de acesso a dados. Ou, se você não tiver conflitos, ignore-o como eu.Eu certamente concordo com sua conclusão. É preferível passar um ID por alguns motivos:
Foo
objeto apenas para o ID significa criar valores falsos. Alguém pode cometer um erro e usar esses valores.int
é mais abrangente em toda a plataforma e pode ser declarado nativamente em todos os idiomas modernos. Para criar umFoo
objeto pelo responsável pela chamada do método, você provavelmente precisará criar uma estrutura de dados complexa (como o objeto json).fonte
Acho que seria sensato estabelecer a pesquisa no identificador do objeto, como sugeriu Ben Voigt.
No entanto, lembre-se de que o tipo do identificador do seu objeto pode mudar. Como tal, eu criaria uma classe de identificador para cada um dos meus itens e só permitiria a pesquisa dos itens por meio dessas instâncias desses identificadores. Veja o seguinte exemplo:
Eu usei encapsulamento, mas você também pode
Item
herdarItemId
.Dessa forma, se o tipo de seu ID for alterado ao longo do caminho, você não precisará alterar nada na
Item
classe ou na assinatura do método GetItem. Somente na implementação do serviço você precisaria alterar seu código (que é a única coisa que muda em todos os casos)fonte
Depende do que o seu método faz.
Geralmente
Get methods
, é bom senso passarid parameter
e recuperar o objeto. Enquanto estava para atualização ouSET methods
você enviava o objeto inteiro para ser definido / atualizado.Em alguns outros casos em que você
method is passing search parameters
(como uma coleção de tipos primitivos individuais) recupera um conjunto de resultados, pode ser sábio parause a container to hold
seus parâmetros de pesquisa. Isso é útil se, a longo prazo, o número de parâmetros for alterado. Assim, vocêwould not need
deve alterar osignature of your method, add or remove parameter in all over the places
.fonte