Frage

Ich bin auf der Suche in eine Entity Framework 4 generic-Repository für ein neues ASP.NET MVC-Projekt erstellen an dem ich arbeite. Ich habe in verschiedenen Tutorials gesucht und sie alle scheinen die Einheit des Arbeitsmuster zu verwenden ...

Von dem, was ich Lesung war, EF nutzt dies bereits im Object und Sie erweitern einfach dies Ihre eigenen Arbeitseinheiten zu machen.

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

Warum sollte man gehen, um den Aufwand, dies zu tun? Ist dies der bevorzugte Weg, mit generischen Repositories zu arbeiten?

Vielen Dank, Kohan.

War es hilfreich?

Lösung

Das ist nicht die Art, wie ich mit generischem Repositories funktionieren würde. Zunächst einmal würde ich Object zwischen ClassARepository, CalssBRepository und anderen Repositories in aktueller Anforderung teilen. IOC-Container verwendet, mit Einspritzung und pro Anfrage Verhalten wird empfohlen:

Dies ist, wie meine generic Repositorys wie folgt aussehen:

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

}

Object durch Konstruktor injiziert. List () Methoden geben IQueryable zur weiteren Verarbeitung in Business-Schicht (Service) Objekte. Service-Layer kehrt Liste oder IEnumerable, so wird es keine Ausführung in Ansichten verschoben.

Dieser Code wurde mit EF1 erstellt. EF4-Version kann ein wenig anders und einfacher sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top