Pregunta

El proyecto actualmente estoy trabajando en el requiere una gran cantidad de páginas searhing / filtrado. Por ejemplo, tengo una página de búsqueda para obtener comlex emisiones realizadas por los datos, categoría, unidad, ...

problema de clase de dominio es compleja y contiene gran cantidad de objetos de valor y objetos secundarios.

.I pregunto cómo las personas a lidiar con la búsqueda / filtrado / de Información para la interfaz de usuario. Por lo que yo sé que tengo 3 opciones pero ninguno de ellos me hacen feliz.

1.) Enviar parámetros al repositorio / DAO para Obtener DataTable y Enlazar DataTable a la interfaz de usuario Controls.For Ejemplo de ASP.NET GridView

DataTable dataTable =issueReportRepository.FindBy(specs);
.....
grid.DataSource=dataTable;
grid.DataBind();

En esta opción puedo simplemente pasar a la Capa de Dominio y la base de datos de consulta para las especificaciones dadas. Y no tiene que obtener el objeto de dominio complejo, totalmente construida. No hay necesidad de objetos de valor, los objetos secundarios, .. Obtener los datos a que se muestra en la interfaz de usuario en el DataTable directamente de la base de datos y mostrar en la interfaz de usuario.

Pero si tienen que mostrar un campo calculado en la interfaz de usuario como valor de retorno método que tengo que hacer esto en la base de datos porque no tengo totalmente objeto de dominio. Tengo que duplicar los problemas de lógica y DataTable como ningún intelisense etc ...

2.) Enviar parámetros al repositorio / DAO para Obtener DTO y Enlazar a DTO IU controles.

IList<IssueDTO> issueDTOs =issueReportRepository.FindBy(specs);
....
grid.DataSource=issueDTOs;
grid.DataBind();

En esta opción es igual que como el anterior, pero tengo que crear objetos anémica DTO para cada página de búsqueda. También para diferentes páginas de búsqueda problema que tengo para mostrar diferentes partes de la Emisión Objects.IssueSearchDTO, CompanyIssueTO, MyIssueDTO ....

3.) Enviar parámetros a la clase real del repositorio para obtener objetos de dominio totalmente construidos.

IList<Issue> issues =issueRepository.FindBy(specs);
//Bind to grid...

Me gusta Domain Driven Design y patrones. No hay ninguna lógica DTO o duplicación en este option.but en esta opción tengo que crear mucho de la de los niños y objetos de valor que no se muestra en la UI.Also que requiere gran cantidad de OB se unen para obtener el objeto de dominio completo y costo de rendimiento para las agujas niño objetos y objetos de valor.

Yo no uso de cualquier herramienta ORM Tal vez pueda aplicar Lazy Loading con la mano para esta versión pero parece un poco exagerado.

¿Cuál te gusta más? O estoy haciendo mal? ¿Hay alguna sugerencia o una mejor manera de hacer esto?

¿Fue útil?

Solución

Tengo algunas sugerencias, pero por supuesto la respuesta general es "depende".

En primer lugar, usted debe utilizar una herramienta ORM o usted debe tener una muy buena razón para no estar haciendo.

En segundo lugar, la aplicación de Lazy Loading con la mano es relativamente sencilla por lo que en el caso de que usted no va a utilizar una herramienta ORM, simplemente puede crear propiedades de los objetos que dicen algo como:

private Foo _foo;
public Foo Foo
{  
  get {  
         if(_foo == null)
         {
            _foo = _repository.Get(id);
         }
         return _foo;
       }
}

En tercer lugar, el rendimiento es algo que debe ser considerado al principio, pero que no debe conducir lejos de un diseño elegante. Yo diría que se debe utilizar (3) inicialmente y sólo se desvían de él si su rendimiento es insuficiente. Esto se traduce por escrito la menor cantidad de código y tener la menor duplicación en su diseño.

Si el rendimiento se resiente puede abordar fácilmente en la capa de interfaz de usuario mediante el almacenamiento en caché y / o en la capa de dominio utilizando Lazy Loading. Si éstos tanto no pueden proporcionar un rendimiento aceptable, entonces se puede recurrir a un enfoque DTO en la que sólo pasar de nuevo a una colección de objetos de valor ligera necesarios.

Otros consejos

Este es un gran pregunta y quería dar mi respuesta también. Creo que el técnicamente mejor respuesta es ir con la opción # 3. Proporciona la capacidad de describir mejor y organizar los datos, junto con la escalabilidad para futuras mejoras en la presentación de informes / búsqueda solicitudes.

No obstante si bien esto puede ser la mejor opción en general, hay un enorme costo de la OMI contra los demás (2) opciones que son el tiempo de diseño adicional para todas las clases y relaciones necesarias para apoyar la necesidades de informes (de nuevo bajo la premisa de que no hay ninguna herramienta ORM que se utiliza).

lucho con esto en muchas de mis aplicaciones, así y la realidad es que # 2 es el mejor compromiso entre el tiempo y el diseño. Ahora bien, si usted preguntaba acerca de sus objetos busniess y todas sus necesidades no es no pregunta que un modelo totalmente diseñado y adecuadamente diseñado es importante y no hay sustituto. Sin embargo, cuando se trata de informar y buscar esto para mí es un animal diferente. # 2 proporciona inflexible de tipos de datos en las clases anémicos y no es tan primitivo como valores codificados en conjuntos de datos como # 1, y aún reduce en gran medida la cantidad de tiempo necesario para completar el diseño en comparación con # 3.

Lo ideal Me gustaría extender mi modelo de objetos para abarcar todas las necesidades de información, pero a veces el esfuerzo necesario para hacer esto es tan amplia, que la creación de un conjunto separado de clases sólo para informar necesidades es una opción más fácil, pero sigue siendo viable. De hecho, me pregunté casi idéntica a esta pregunta hace unos años y también me dijeron que la creación de otro conjunto de clases (esencialmente DTO) para informar de necesidades no era una mala opción.

Así que para envolverlo, # 3 es técnicamente la mejor opción, pero # 2 es probablemente la opción más realista y viable al considerar el tiempo y calidad juntos para informes complejos y necesidades de búsqueda.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top