2009-12-01 15 views
7

Dada una aplicación que implique, por ejemplo, empresas, podría tener una clase de empresa. Tendré una capa de acceso a datos que rellena una lista <Company>. Sin embargo, habrá momentos (como mostrar un resultado de búsqueda) donde solo necesito mostrar el nombre de la empresa, el teléfono y las propiedades del código postal, y me parece que ocupar todo el objeto de la Compañía con todas sus propiedades parece un desperdicio.DDD "Ver objetos"?

¿Cuál sería la forma correcta de hacerlo en términos de un diseño DDD? ¿Crearía clases específicas de View, como un objeto CompanySearchResult que solo expone las propiedades que estoy interesado en mostrar?

Respuesta

4

Eso suena como un enfoque razonable para mí.

Más adelante, si el cliente es lo que le pide su SearchResult para mostrar algo no relacionado con el modelo Company - algo loco como el número de heladerías cercanas tendrá un tiempo mucho más fácil añadiendo esto a su CompanySearchResult de su objeto de dominio

+0

Estaba pensando en algo aún más "loco", como tener el resultado de búsqueda como solo un elemento en la pantalla. También podría querer una lista de recordatorios diarios en una grilla y un resumen del clima actual. ¿Agregaría mi CompanySearchResult, WeatherSummary y ReminderList en una clase MyComplexFormViewModel específicamente para ese formulario o página web? – Michael

+0

@Michael - En ese escenario, probablemente haría una vista de contenedor que contenía un CompanySearchResult, WeatherSummary y ReminderList – Kirschstein

+0

@Kirschstein - ¿es una "vista de contenedor" igual o diferente a la que propuse con la idea MyComplexFormViewModel? – Michael

0

Uso una migaja de los atributos de entidad. Por ejemplo:

// interface for "ID" attribute of Company entity 
public interface ICompany_ID { 
    Guid CompanyID{get;set;} 
} 
// interface for "Name" attribute of Company entity 
public interace ICompany_Name { 
    string Name{get;set;} 
} 
// interface for "Logo" attribute of Company entity 
public interface ICompany_Logo { 
    byte[] Logo{get;set;} 
} 

// interface for all attributes of Company entity 
public interface ICompany : ICompany_ID, ICompany_Name, ICompany_Logo { } 

// base class for classes based on Company entity 
public abstract class CompanyBase : ICompany_ID { 
    // implementation of ICompany_ID interface 
} 

// class for all attributes of Company entity 
public class Company : ICompany { 
    // implementation of ICompany interface (all attributes) 
} 

// class for Company name lookup 
public class CompanyNameLookup : CompanyBase, ICompany_Name { 
    // implementation of ICompany_Name interfade 
} 

Este crumble me permite trabajar con diferentes atributos de diferentes entidades y todo es seguro. sin embargo, su capa de datos debe admitir este escenario.

La siguiente forma es la creación dinámica de clases de búsqueda, pero es mucho más compleja. Por otro lado, es mucho más flexible.

EDIT: entonces la selección puede ser por ejemplo:

var companies = (from c in db.Table<ICompany>() 
       order by c.Name 
       select new CompanyNameLookup { ID = c.ID, Name = c.Name } 
       ).ToList(); 

o para tipos danymicly creados:

var companies = (from c in db.Table<ICompany>() 
       order by c.Name 
       select DynamicTypeFactory.New<ICompany_ID>(c.Id).And<ICompany_Name>(c.Name).Create() 
       ).ToList(); 

El DynamicTypeFactory es la clase con método estático New y la interfaz de fluido para danymic clases de creación en tiempo de ejecución.

+3

en mi humilde opinión, esto es simplemente erróneo. –

+0

@Frederik: ¿Por qué crees? Utilicé este escenario en varios proyectos empresariales exitosos y funciona muy bien. – TcKs

+1

Estoy de acuerdo con Frederik tbh, parece ser demasiado complicado con pocas ganancias. – Kirschstein

3

Esto es lo que normalmente se conoce como un "modelo de vista" o un objeto de transferencia de datos. Es posible que no desee que su vista tenga acceso a todo el árbol de datos expuesto por su modelo de dominio. Especialmente si exponer su modelo de dominio significa que su vista tendrá que profundizar en su gráfico de objetos para extraer los datos que necesita, un Modelo de visualización puede tener mucho sentido para simplificar el trabajo con los objetos del modelo. En su caso, si simplemente está quitando propiedades directas del objeto modelo, tendría sentido si desea ocultar los datos extraños que no necesita el resto de su modelo de dominio.

1

El enfoque que sugiere puede aumentar rápidamente el número de DAO: s que necesita crear y convertirse en una pesadilla de mantenimiento. El enfoque que varios ORM tomar es aproximar el acceso a los datos, por lo que su capa de acceso de datos devolverá una lista de interfaces, y la llamada base de datos se pospondrá hasta que invoque el descriptor de acceso de datos, por ejemplo

list.getCompany(1).getName()

. Esto se llama carga lenta. Todavía tendrá que hacer una transacción entre hacer muchas consultas grandes o pequeñas. Este tipo de tareas es uno de los puntos fuertes de los ORM, por lo general, puede solicitarle a su ORM que realice una captación previa de las partes del gráfico de objetos que crea que se utilizarán y omita otras partes.

+0

Hmm. ORMs Otra avenida de exploración para mí ... ¿Puedes sugerir un buen punto de partida? – Michael

+0

@Michael - Hay toneladas de preguntas relacionadas con .NET ORM en stackoverflow, solo haz algo de navegación. Normalmente, NHibernate es el más recomendado para proyectos grandes, aunque tiene una curva de aprendizaje abrupta (pero cada vez mejor). Para proyectos más pequeños y tipo de asuntos de "empezar a trabajar", tal vez Subsonic o LinqToSql si ya tiene un esquema de base de datos. – Kirschstein

+1

No creo que este sea un buen enfoque. No debe usar la "carga diferida" sin pensar. Debes pensar dónde y cuándo aplicarás la carga diferida en lugar de usarla mal de esta manera. Más información: http://davybrion.com/blog/2009/11/theres-lazy-loading-and-then-theres-lazy-coding/ Preferiría las clases 'View'/SearchREsult. Incluso cuando se utiliza un ORM como NHibernate, es muy fácil de usar/apoyar. Puede realizar consultas en su modelo de dominio y usar una proyección para recuperar un objeto 'Ver'. –