Al proporcionar un método de lógica de negocios para obtener una entidad de dominio, ¿el parámetro debe aceptar un objeto o una ID? Por ejemplo, deberíamos hacer esto:
public Foo GetItem(int id) {}
o esto:
public Foo GetItem(Foo foo) {}
Creo en pasar objetos en su totalidad, pero ¿qué pasa con este caso en el que estamos obteniendo un objeto y solo conocemos la identificación? ¿La persona que llama debe crear un Foo vacío y establecer la ID, o simplemente debe pasar la ID al método? Dado que el Foo entrante estará vacío, a excepción de la ID, no veo el beneficio de que la persona que llama tenga que crear un Foo y establecer su ID cuando solo podría enviar la ID al método GetItem ().
fuente
¿Esto pasará por el cable (serializado / deserializado) en algún momento ahora o en el futuro? Favorezca el tipo de ID único sobre el objeto completo who-know-how-large.
Si está buscando la seguridad de tipo de la ID para su entidad, también hay soluciones de código. Avísame si necesitas un ejemplo.
Editar: expandiendo la seguridad de tipo de ID:
Entonces, tomemos su método:
Solo esperamos que el entero
id
que se pasa sea para unFoo
objeto. Alguien podría usarlo mal y pasarBar
la identificación entera de algún objeto o incluso simplemente escribir a mano812341
. No es de tipo seguroFoo
. En segundo lugar, incluso si utilizó laFoo
versión de pasar un objeto , estoy seguro de queFoo
tiene un campo de identificaciónint
que alguien puede modificar. Y, por último, no puede usar la sobrecarga de métodos si estos existen en una clase juntos, ya que solo varía el tipo de retorno. Reescribamos este método un poco para que tenga un tipo seguro en C #:Así que introduje una clase llamada
IntId
que tiene una pieza genérica. En este caso particular, quiero unint
asociadoFoo
solo con eso . No puedo pasar desnudoint
ni asignarle unIntId<Bar>
accidente accidentalmente. Entonces, a continuación es cómo he escrito estos identificadores de tipo seguro. Tenga en cuenta que la manipulación del subyacente realint
es solo en su capa de acceso a datos. Todo lo anterior que solo ve el tipo fuerte y no tiene acceso (directo) a suint
ID interna . No debería tener ninguna razón para hacerlo.Interfaz IModelId.cs:
Clase base ModelIdBase.cs:
IntId.cs:
y, para completar mi código base, también escribí uno para entidades GUID, GuidId.cs:
fuente
Origin
propiedad: es muy parecido a un esquema en el lenguaje de SQL Server. Puede tener unoFoo
que se usa en su software de Contabilidad y otroFoo
que es para Recursos Humanos y ese pequeño campo existe para distinguirlos en su capa de acceso a datos. O, si no tienes conflictos, ignóralo como yo.Ciertamente estoy de acuerdo con tu conclusión. Pasar una identificación es preferible por algunas razones:
Foo
objeto solo para la identificación significa crear valores falsos. Alguien puede cometer un error y usar estos valores.int
abarca más toda la plataforma y se puede declarar de forma nativa en todos los idiomas modernos. Para crear unFoo
objeto mediante el método que realiza la llamada, probablemente necesitará crear una estructura de datos compleja (como el objeto json).fuente
Creo que sería prudente establecer la búsqueda en el identificador del objeto como ha sugerido Ben Voigt.
Sin embargo, recuerde que el tipo de identificador de su objeto puede cambiar. Como tal, crearía una clase de identificador para cada uno de mis elementos, y solo permitiría buscar los elementos a través de estas instancias de estos identificadores. Vea el siguiente ejemplo:
Usé encapsulación, pero también puedes hacer
Item
heredar deItemId
.De esa manera, si el tipo de su identificación cambia a lo largo del camino, no tiene que cambiar nada en la
Item
clase o en la firma del método GetItem. Solo en la implementación del servicio tendría que cambiar su código (que de todos modos es lo único que cambia en todos los casos)fuente
Depende de lo que haga tu método.
En general
Get methods
, es de sentido común pasarid parameter
y recuperar el objeto. Mientras que para la actualización oSET methods
enviaría todo el objeto para ser configurado / actualizado.En algunos otros casos donde su
method is passing search parameters
(como una colección de tipos primitivos individuales) para recuperar un conjunto de resultados, podría ser conveniente parause a container to hold
sus parámetros de búsqueda. Esto es útil si a largo plazo cambiará el número de parámetros. Por lo tanto,would not need
para cambiar elsignature of your method, add or remove parameter in all over the places
.fuente