Domanda

Sto cercando di creare un repository generico Entity Framework 4 per un nuovo progetto ASP.NET MVC sto lavorando su. Sono stato a guardare vari tutorial e tutti sembrano utilizzare l'unità di modello di lavoro ...

Da quello che ho letto, EF sta usando questo già all'interno della ObjectContext e si sono semplicemente estendendo questo per rendere le proprie unità di lavoro.

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

perché uno fare lo sforzo di fare questo? E 'questo il modo migliore di lavorare con repository generici?

Molte grazie, Kohan.

È stato utile?

Soluzione

Non è questo il modo in cui avrei lavorato con i repository generici. Prima di tutto, vorrei condividere ObjectContext tra ClassARepository, CalssBRepository e altri repository di richiesta corrente. Utilizzando il contenitore CIO, con iniezione e per il comportamento di richiesta è raccomandato:

Ecco come il mio repository generici assomigliano:

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 viene iniettato attraverso costruttore. Lista () metodi restituiscono IQueryable per l'ulteriore elaborazione a livello di business (servizio) oggetti. ritorna livello di servizio Elenco o IEnumerable, quindi non c'è differiti esecuzione in vista.

Questo codice è stata creata usando EF1. Versione EF4 può essere un po 'diverso e più semplice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top