2011-08-05 13 views
5

Estoy trabajando en una aplicación prototipo EF, utilizando POCO. Principalmente como introducción al framework me pregunto acerca de una buena manera de configurar la aplicación en una estructura agradable. Más tarde, planeo incorporar WCF en él.Configuración de la estructura de una aplicación EF

Lo que he hecho es el siguiente:

1) que crea un archivo edmx, pero con la propiedad de generación de código configurado en Ninguno y genera mi esquema de base de datos,

2) que creó el POCOs todos los cuales se ven como:

public class Person 
{ 
    public Person() 
    { 
    } 

    public Person(string firstName, string lastName) 
    {   

     FirstName = firstName; 
     LastName = lastName; 
    } 

    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

3) he creado un contexto

public class PocoContext : ObjectContext, IPocoContext 
{ 
    private IObjectSet<Person> persons; 

    public PocoContext() : base("name=PocoContainer", "PocoContainer") 
    { 
     ContextOptions.LazyLoadingEnabled = true; 
     persons= CreateObjectSet<Person>(); 
    } 

    public IObjectSet<Person> Persons 
    { 
     get 
     { 
      return persons; 
     } 
    } 

    public int Save() 
    { 
     return base.SaveChanges(); 
    } 
} 

La interfaz se parece a esto:

public interface IPocoContext 
{ 
    IObjectSet<Person> Persons { get; } 

    int Save(); 
} 

4) Por último he creado un repositorio, la implementación de una interfaz:

public class PersonRepository : IEntityRepository<Person> 
{ 
    private IPocoContext context; 

    public PersonRepository() 
    { 
     context = new PocoContext(); 
    } 

    public PersonRepository(IPocoContext context) 
    { 
     this.context = context; 
    } 

    // other methods from IEntityRepository<T> 
} 

public interface IEntityRepository<T> 
{ 
    void Add(T entity); 
    List<T> GetAll(); 
    T GetById(int id); 
    void Delete(T entity); 

} 

Ahora, cuando me subo a jugar con esto, este diseño me dicta para crear una instancia un repositorio cada vez que quiero a buscar o mutar algunos datos, como esto:

using (var context = new PocoContext()) 
{ 
    PersonRepository prep = new PersonRepository(); 

    List<Person> pers = prep.GetAll(); 
} 

de alguna manera esto sólo se siente mal y defectuosa, por el contrario, solo una instancia de cada repositorio en el de El contexto rived tampoco se siente demasiado bien, debido a la posibilidad de instanciar objetos que podría no necesitar en absoluto.

¿Algún consejo sobre cómo hacer que este diseño suene? ¿Debo dejarlo así? ¿Alguna cosa que deba agregar o evitar en general al hacer esto?

+0

¿Qué tipo de aplicación es? Servicio web, WPF-app, ¿algo más? – alun

+0

En este estado, es solo una aplicación de consola, ya que es solo un prototipo al mínimo. – duress

+1

La razón por la que pregunto es que la forma en que manejas tu contexto está muy influenciada por el tipo de aplicación. Es común, por ejemplo, tener un contexto por formulario en una aplicación wpf y un contexto por solicitud http en una aplicación web y un contexto por llamada de método en un servicio web. – alun

Respuesta

2

No entiendo esta parte:

using (var context = new PocoContext()) 
{ 
    PersonRepository prep = new PersonRepository(); 

    List<Person> pers = prep.GetAll(); 
} 

Por qué estás creando el contexto en el ámbito exterior si se llama constructor de depósito sin pasar el contexto como parámetro? Usar contextos múltiples hará las cosas mucho más difíciles. Además, ¿qué sentido tiene crear la interfaz para el repositorio e intentar ocultarla si su bloque externo solo crea una instancia de la clase?

¿Es correcto su enfoque? Generalmente sí Debe usar single context for logical operation (unidad de trabajo) y si su repositorio obtiene contexto a través del constructor, necesita crear un nuevo conjunto de repositorios para cada contexto. Esto generalmente se logra a través de la inyección de dependencia.

acaba de crear instancias de cada repositorio en el contexto derivada no sienten demasiado bueno tampoco, debido a instanciar objetos potencialmente I que no necesite en absoluto.

Bueno, esto puede resolverse con bastante facilidad por la inicialización perezosa:

private SomeRepositoryType _someRepository 
public SomeRepositoryType SomeRepository 
{ 
    get { _someRepository ?? (_someRepository = new SomeRepositoryType(context)) } 
} 

pero no me poner esto en contexto mismo.Probablemente usaría esto en alguna fábrica de acceso a datos, ya que debería estar fuera del contexto y pasar una única fábrica, ya que la inyección a clases/métodos mediante múltiples repositorios es más simple.

Btw. what value ¿obtendrá de usar el repositorio?

+0

Lo pensé después de leer tu publicación y espero que puedas comentar lo que voy a decir. En primer lugar, este proyecto está inspirado principalmente en un tutorial y durante el almuerzo de esta tarde me hice la misma pregunta exacta al principio de este tema. Los repositorios simplemente agregan una capa adicional a la que llamo AddObject (o lo que sea). Dicho esto, ahora que lo pienso, realmente creo que no me aprovecho de esto en este momento ... – duress

1

Si usa POCO para crear un modelo de su base de datos, ¿puede intentar con el código EF primero? En mi humilde opinión, el uso de Code First es más claro que crear el modelo EDMX en el diseñador.

+0

Sí, lo es, pero en este caso puedo elegir algunas cosas sobre cómo se configura el edmx también. – duress

+0

Realmente, siga estos consejos y use Code First. No tiene ninguna razón para meterse con EDMX en primer lugar. Y si realmente quiere ver cómo sería el edmx, existe la opción de generarlo a partir de las primeras clases del código. –

0

Use Dependency Injection usando cualquier contenedor como Castle Windsor, AutoFac, etc., proporcionando Contexto del Objeto por solicitud.

Cuestiones relacionadas