2010-07-16 25 views
6

Recientemente he leído el artículo "The Entity Framework In Layered Architecture" y está escrito que podemos enviar entidades EF al cliente a través de WCF. Pero en muchos hilos en Stackoverflow las personas dicen que los objetos POCO (DTO) deberían usarse cuando usamos WCF. Y tengo algunas preguntas.Marco de entidad en Arquitecturas estratificadas

  1. ¿Por qué Microsoft agregó el atributo DataContract a EF-entities? ¿Microsoft quiere que usemos estos objetos en todas partes en nuestras aplicaciones? ¿O esto es solo para aplicaciones muy simples y para un desarrollo rápido?

  2. Si uso objetos POCO, ¿debo crear EF-Entidades generadas automáticamente, POCO-Entities y luego usar cualquier biblioteca de mapeo entre ellas? ¿O debería usar solo objetos POCO en todos los componentes de mi aplicación?

  3. Si ya tengo mi propia entidad comercial, que tiene algunos métodos, y debe asignarse al objeto POCO, en qué capa debo convertir el objeto POCO a mi entidad (por ejemplo, tengo capa de persistencia, negocio capa de lógica, capa de servicio (WCF), capa de presentador (cliente, uso WCF), capa de UI)? ¿O no debería crear mis propias entidades?

Gracias de antemano

+2

Tenga en cuenta que este artículo fue escrito hace 2 años. Muchas cosas han cambiado desde entonces. EF 4.0 trae algunas características nuevas, funciona con poco, funciona mejor con wcf y más. – nemke

+0

Sí, lo entiendo. Solo trato de decidir cómo desarrollar mi aplicación. –

+0

¿Puedo preguntarte qué estás usando en tu UI Layer? – SDReyes

Respuesta

3

1. ¿Por qué tenían Microsoft añaden DataContract atributo a EF-entidades? ¿Quiere Microsoft que usemos estos objetos en todas partes en nuestras aplicaciones ? ¿O solo para las aplicaciones simples y para el desarrollo rápido de ?

En términos generales, es una mala idea para exponer sus EF-entidades en la capa de servicio debido a que difícilmente parejas de su capa de servicios y el modelo de representación. por lo que cualquier cambio realizado en el modelo termina afectando directamente sus servicios, no es una buena idea. también tendrá que versionar su capa de servicio en algún momento, así que evite exponer las entidades EF en su capa de servicio.

2. Si utilizo poco-objetos, debería crear generadas automáticamente EF-Entidades, poco-Entidades y después de que el uso de cualquier biblioteca mapeo entre ellos? ¿O I debería usar solo objetos POCO en todos los componentes de mi aplicación?

Puede utilizar objetos POCO dentro de su capa de servicios, para desacoplar desde cualquiera de las capas subyacentes (ver AutoMapper, para cubrir el costo de mapeo de entidad-DTO). pero aún podría usar las entidades EF autogeneradas entre las capas de datos y negocios en su arquitectura. simplemente trate de no confiar en las características específicas de EF de su modelo de dominio generado en otras capas diferentes de la capa de datos. para facilitar la migración a otros marcos ORM.

Si ya tengo mi propia empresa con , que tiene algunos métodos, y debe correlacionarse con objeto POCO, en qué capa debería convertir POCO a objetos para mi entidad (por ejemplo, Tengo capa de persistencia, negocio capa lógica, capa de servicio (WCF), capa presentadora (cliente, uso WCF), UI capa)? ¿O no debería hacer tales mis propias entidades ?

Capa de servicio http://msdn.microsoft.com/en-us/library/ms978717.aspx. usted usaría su modelo de dominio de forma transparente entre el nivel del servidor (persistencia, negocio, servicio y capas del presentador) de su aplicación, y la única capa que requerirá una asignación DTO es la capa de servicio, consulte la pregunta 1. (adicionalmente si están usando ViewModels dentro de la capa del presentador -nice idea-, necesitarás utilizar la asignación de POCOs en la capa del presentador también).

+0

Sugeriría enviar POCO al cliente, excepto si existe una tecnología que lo requiera (los servicios de RIA aparentemente lo hacen, pero debo confirmarlo). Entonces expondrías una capa de servicio más limpia – SDReyes

+0

Muchas gracias. Y si decido cambiar EF a otro ORM, también debería modificar la capa de servicio, ¿verdad? –

+0

Exactamente. capa de negocios y servicios. Así que no tendrá que preocuparse por poblar y manejar DTO hasta la frontera de su solución, la capa de servicio. – SDReyes

1

Usted puede tener entidades POCO escrita a mano y completamente separada de la capa de persistencia. SDReys tiene razón, usando entidades de EF generadas ya que su modelo huele mal.

Aquí está el diseño aproximado para un modelo de POCO simple y el contexto para apoyarlo.

public class MyApplicationContext : ObjectContext, IMyApplicationContext { 
    public MyApplicationContext() : base("name=myApplicationEntities", "myApplicationEntities") 
    { 
    base.ContextOptions.LazyLoadingEnabled = true; 
     m_Customers = CreateObjectSet<Customer>(); 
     m_Accounts = CreateObjectSet<Account>(); 
    } 

private ObjectSet<Customer> m_Customers; 
public IQueryable<Customer> Customers { 
     get { return m_Customers; } 
    } 
private ObjectSet<Account> m_Accounts; 
public IQueryable<Account> Accounts { 
     get { return m_Accounts; } 
    } 

public Account CreateAccount(Customer customer) { 
    var account m_Accounts.CreateObject(); 
    account.Customer = customer; 
    return account; 
} 
public Customer CreateCustomer() { 
    return m_Customers.CreateCustomer(); 
} 

public void AddAccount(Account account) { 
    m_Accounts.AddObject(account); 
} 
public void AddCustomer(Customer customer) { 
    m_Customers.AddCustomer(customer); 
} 
} 

public class Account { 
    public int Balance {get;set;} 
    virtual public Customer{get;set;} 
} 

public class Customer { 
    public string Name {get;set;} 
    virtual public List<Account> Accounts{get;set;} 
}