2010-10-18 8 views
5

Recientemente me he unido a una empresa que usa conjuntos de datos tipeados como su 'Dto'. Creo que son realmente basura y quieren cambiarlo a algo un poco más moderno y fácil de usar. Entonces, estoy tratando de actualizar el código para que la capa de datos sea más genérica, es decir, usando interfaces, etc., el otro tipo no sabe qué es un Dto y estamos teniendo un ligero desacuerdo sobre cómo se debe hacer.C# Data Layer y Dto's

Sin tratar de influir en mi forma de pensar, me gustaría obtener respuestas imparciales de ustedes sobre en qué capas puede estar presente el Dto. Todas las capas; DAL, BL y Presentation o un pequeño subconjunto dentro de estas capas solamente.

Además, si los objetos IList deberían o no estar presentes en el DAL.

Gracias.

+2

@leppie: ver http://rlacovara.blogspot.com/2009/03/what-is-difference-between-dto-and-poco.html – tsimbalar

+1

Objeto de transferencia de datos: un peso ligero y (por lo general) libre de contexto versión de un objeto de dominio empresarial (u objetos). –

+0

Perdón, no debería asumir que todos conocen los acrónimos. –

Respuesta

5

Realmente depende de su arquitectura.

Para la mayoría de los puntos debe intentar codificar a las interfaces, entonces realmente no importa cuál es su implementación. Si devuelve ISomething, podría ser su SomethingEntity o su SomethingDTO pero a su código de consumo no le importa menos, siempre y cuando implemente la interfaz.

Debe devolver un IList/ICollection/IEnumerable sobre una colección concreta o matriz.

Lo que usted debe tratar de hacer primero es separar el código y que sea imprecisa mediante la inserción de algunas interfaces entre sus capas, tales como depósito de la capa de DataAccess. Su repositorio luego devuelve sus entidades encapsuladas por una interfaz. Esto hará que tu código sea más comprobable y te permitirá burlarte más fácilmente. Una vez que tenga las pruebas en su lugar, puede comenzar a cambiar las implementaciones con menos riesgo.

Si empiezas a usar interfaces, sugiero integrar un IoC como Windsor más pronto que tarde. Si lo haces desde el principio, facilitará las cosas más adelante.

+0

Esta es más de la ruta que estaba buscando bajar, especialmente las técnicas de inyección de IoC y dependencia. , y de hecho esto es lo que estaba tratando de explicar al otro desarrollador en la oficina. –

2

Una cosa es que los DataSets son pobres para lograr la interoperabilidad. Incluso los conjuntos de datos tipados tampoco son tan compatibles cuando se trata de consumir conjuntos de datos tipeados de un cliente que no es .net. Consulte this link. Si tiene que lograr la interoperabilidad, entonces luche duro por los DTO; de lo contrario, intente que su equipo comprenda a los DTO durante un período de tiempo dado que los conjuntos de datos no son tan malos después de todo.

En parte de las interfaces, sí debe estar exponiendo las interfaces. Por ejemplo, si devuelve List<T> de DAL, en su lugar debe devolver IList<T>. Algunas personas llegan al extremo de devolver solo IEnumerable<T> porque todo lo que necesita es capacidad de enumerar. Pero luego al hacerlo no se convierta en astronaut architect.

En mis aplicaciones que se han dado cuenta de que en lugar de regresar IList<T>List<T> contamina mi base de código con los códigos de esta manera:

//consider personCollection as IList<Person> 
(personCollection as List<Person>).ForEach(//Do Something) 

Así que yo personalmente tratar de mantener un equilibrio entre la interfaz de regresar o un objeto concreto. Si me preguntas qué estoy haciendo ahora, entonces te diré que estoy volviendo List<T>. Estoy influenciado para no convertirme en astronaut architect.

+0

Gracias Pradeep (y por las ediciones también). –

+2

Existe una razón para no devolver una lista genérica http://msdn.microsoft.com/en-US/library/ms182142(v=VS.80).aspx. Depende si el objeto que devuelve la Lista es público o privado. Siempre y cuando no expongas la Lista en una interfaz pública, no importa porque solo tu la estás consumiendo. – Bronumski

+1

Sí, estoy de acuerdo si público significa ser consumido por alguien fuera de su aplicación. El público no se debe inferir como especificador de acceso y no significa exponer el tipo de retorno público como interfaz si siempre va a ser consumido por alguna capa en su proyecto que nunca verá luz fuera de una aplicación. – Pradeep

1

Siempre uso DTO, nunca DataTable. Pero solo los uso para transferir de BL a DL y al revés. Mis capas de presentación a menudo solo conocen las capas de negocios y servicios en caso de servicio orientado.

Los beneficios puedo ver a utilizar dtos en lugar de tablas de datos:

  • refactorización fácil
  • fácil producción diagrama
  • código más limpio más fácil de leer, sobre todo en la unidad del DAL prueba
+0

Gracias vc - directamente al punto de mi pregunta, ¿alguna opinión sobre agrupar el Dto en un IEnumerable o similar? –

+0

¿Quiere decir, por ejemplo, permitir que un método GetCustomers en el DAL devuelva un IList o IEnumerable de CustomerDTO? Si es así, no veo ningún motivo por el que no deba permitirlo. –

+0

Gracias vc - eso es exactamente lo que quise decir –

1

Por definición, un DTO es un objeto de transferencia de datos, utilizado para (esperar) transferir datos de una capa a otra.

Los DTO se pueden usar en todas las capas y los he usado bien con servicios web.

+1

Gracias Burt, me gusta la forma en que "revelas" lo que es un DTO :) –

+0

No se preocupe, eche un vistazo al diseño impulsado por dominios, ya que los DTO aparecen en él. Hay algunos excelentes ejemplos de cómo diseñar una solución con reglas comerciales complejas usando DDD. – Burt

+0

Aquí hay un par de enlaces para usted http://dddpds.codeplex.com/ http://ncommon.codeplex.com/ – Burt