Frage

Was ist es, alternative Muster der Verwendung für Entity Framework?

Einige ich kenne, sind:

  1. "Plain" EntityFramework - auch bekannt als Einheit der Arbeit

    using (Data.Model c = new Data.Model())
    {
        var z = c.Users.Where(x=>x.Name=='John');
    }

  2. Repository Muster

    //Model implements IRepository
    User user = Model.Instance.Get<User>(u => u.Name == "John");
    

  3. Was sonst noch?
  4. ?
War es hilfreich?

Lösung

Ein gutes Buch zu sehen ist Martin Fowler " Patterns of Enterprise Application architecture ".

Da ist er einige Muster durchläuft zum Abrufen / Kartierungsdaten wie DTOs, UOW, Repository-Muster etc ... Vielleicht könnten etwas nützlich sein, zusammen mit dem Entity Framework. Ich würde einen Blick auf sie nehmen.

Andere Tipps

ich Ihre Frage beantworten, basierend auf der Annahme, dass Sie Entity Framework verwenden, direkt in Ihrem UI / Controller / Dienstleistungen.

Es ist erwiesen, dass jede ORM, EF inclusing, direkt in Ihrem UI / Controller / Service wird eine Menge Probleme in der Zukunft führen. Hinzu kommt, dass, es macht es so schwer, wenn nicht unmöglich, zu Einheit Testen der Anwendung.

Der zweite Ansatz heißt „Model implementiert Repository“ ist auch falsch meiner Meinung nach, becuase Modell und Lagerräume haben unterschiedliche Verantwortlichkeiten und basierend auf „Single responsibilty“ Teil SOLID Prinzipien sollten Sie die beiden Konzepte nicht miteinander verschmelzen. Selbst wenn Sie Aktiv Objekte Muster in Ihrem Modell verwenden möchten, die ich nicht empfehlen, müssen Sie Ihr Modell aus der ORM entkoppeln Sie verwenden.

Die beste und die am meisten empfohlene Lösung ist eine Schnittstelle wie IRepository oder IRepository mit den sehr einfachen Mitgliedern haben, wie das Muster vermuten läßt. so etwas wie:

Interface IRepository<T> where T:class
{
    void Insert(T entity);
    void Update(T entity);
    void Delete(T entity);

    // if you don't want to return IQueryable
    T FindById(object id);
    IEnumerable FindXXXXX(params)

    // if you prefer to return an IQueryable
    IQueryable<T> Find(Expression<Func<T, bool>> predeicate);
}

Beachten Sie, dass einige poeple Repositorys nicht glauben sollte IQueryable zurückgeben. Darüber hinaus können Sie anstelle von Ausdrücken und Lambda mit ISpecification betrachten.

Sie müssen IRepositoy Schnittstelle für die meisten Ihre Einheiten implementieren. Mit diesem Ansatz können Sie Ihre Repositories auch spotten, wenn Unit-Tests zu schreiben. In der Produktion, müßten Sie einen Ioc Anbieter wie Unity verwenden, Ninject, Linfu, Catsle und etc. Sie auch von Microsofts gemeinsamem Service Locator Implementierung Kopplung an einen spezifi IoC Rahmen zu vermeiden profitieren können.

In den alten Tagen, habe ich eine Datenzugriffsschnittstelle zu haben, die für einen bestimmten Business-Bereich oder eine Dienstleistung impleneted wurde. Eines der Probleme bei diesem Ansatz ist, dass Sie mit doppelten Code in verschiedenen Datenzugriffsdienste enden würde, wenn Sie den Überblick über Ihre Source-Code halten und Sie werden schließlich.

Wir verwenden Code ähnlich dem, was Sie in Ihrem Arbeitseinheit Beispiel haben.

Was wir zusätzlich tun ist, Objekte zu Datenübertragung Objekte abzubilden.

Es gibt viele Artikel zu diesem Thema, aber die Liste erheblich reduziert werden, wenn Sie einen guten mögen. Dieser Artikel von MSDN Magazine ziemlich gut, obwohl es speziell mit n-Tier-Anwendungen befasst. Aber da Sie nicht sagen, was Sie bauen, vielleicht wird es helfen.

LINQ 2 SQL kann eine Alternative sein. Hier ist ein Artikel Dependency Injection mit Unity und Linq to SQL Datacontexts

UNITY - http://unity.codeplex.com/

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