Es el patrón de Entity Framework 4 “unidad de trabajo” el camino a seguir para los repositorios genéricos?

StackOverflow https://stackoverflow.com/questions/2818029

Pregunta

Busco en la creación de un repositorio genérico de Entity Framework 4 para un nuevo proyecto de ASP.NET MVC i estoy trabajando. He estado buscando en varios tutoriales y todos ellos parecen utilizar la Unidad de patrón de trabajo ...

Por lo que he estado leyendo, EF está utilizando esta ya dentro de la ObjectContext y que está simplemente extendiendo esto para hacer sus propias unidades de trabajo.

Fuente: http://dotnet.dzone.com/news/using-unit-work-pattern-entity?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+zones%2Fdotnet+ (NET + Zona)

¿Por qué uno hacer el esfuerzo de hacer esto? ¿Es esta la forma de trabajar con los repositorios genéricos?

Muchas gracias, Kohan.

¿Fue útil?

Solución

Esta no es la forma en que trabajaría con los repositorios de genéricos. En primer lugar, me gustaría compartir ObjectContext entre ClassARepository, CalssBRepository y otros repositorios en la solicitud actual. El uso de contenedores COI, mediante inyección y por el comportamiento solicitud se recomienda:

Esta es la forma en mis repositorios genéricos se ven como:

public interface IRepository<T>
{
    //Retrieves list of items in table
    IQueryable<T> List();
    IQueryable<T> List(params string[] includes);
    //Creates from detached item
    void Create(T item);
    void Delete(int id);
    T Get(int id);
    T Get(int id, params string[] includes);
    void SaveChanges();
}

public class Repository<T> : IRepository<T> where T : EntityObject
{
    private ObjectContext _ctx;

    public Repository(ObjectContext ctx)
    {
        _ctx = ctx;
    }


    private static string EntitySetName
    {
        get
        {
            return String.Format(@"{0}Set", typeof(T).Name);
        }
    }

    private ObjectQuery<T> ObjectQueryList()
    {
        var list = _ctx.CreateQuery<T>(EntitySetName);
        return list;
    }

    #region IRepository<T> Members

    public IQueryable<T> List()
    {
        return ObjectQueryList().OrderBy(@"it.ID").AsQueryable();
    }

    public IQueryable<T> List(params string[] includes)
    {
        var list = ObjectQueryList();

        foreach(string include in includes)
        {
            list = list.Include(include);
        }

        return list;
    }

    public void Create(T item)
    {
        _ctx.AddObject(EntitySetName, item);
    }

    public void Delete(int id)
    {
        var item = Get(id);
        _ctx.DeleteObject(item);
    }

    public T Get(int id)
    {
        var list = ObjectQueryList();
        return list.Where("ID = @0", id).First();
    }

    public T Get(int id, params string[] includes)
    {
        var list = List(includes);
        return list.Where("ID = @0", id).First();
    }

    public void SaveChanges()
    {
        _ctx.SaveChanges();
    }

    #endregion

}

ObjectContext se inyecta a través constructor. Lista () métodos devuelven IQueryable para su posterior procesamiento en la capa de negocio (servicios) objetos. vuelve capa de servicio de lista o IEnumerable, por lo que no se difiere ejecución en puntos de vista.

Este código se ha creado usando EF1. EF4 versión puede ser un poco diferente y más simple.

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