2012-03-26 7 views
3

In meiner Anwendung habe ich eine DAL mit einer Repository-Klasse erstellt. Das Repository verwendet einen Satz von EF-Klassen als Datenkontext.So abstrahieren Sie den Entitätsdatenkontext in C#

Ich mag eine Abstraktion schaffen, um Lage zu sein, mehrere Datenkontext mit dem gleichen Repository verwenden. Ich verwende den folgenden Code, den Kontext zu initialisieren (ProductEntities ist der EF-Kontext):

public class ProductRepository : IProductRepository 
{ 
    ?type? _productEntitiesContext; 

    public productRepository() 
    { 
     _productEntitiesContext = new ProductEntities(); 
    } 

    public productRepository(?type? productContext) 
    { 
     _productEntitiesContext = productContext; 
    } 
} 

Aber ich weiß nicht, welche Art von _productEntitiesContext (und productContext). ProductEntities erbt von ObjectContext.

Um Abstraktion zu erreichen benutze ich immer Schnittstellen, ich weiß nicht, ob ich ObjectContext verwenden kann, da es eine Klasse ist.

Jeder weiß, ob mein Ziel erreichbar ist?

Antwort

2

So ähnlich?

public class ProductRepository<T> : IProductRepository where T: new() 
{ 
    T _productEntitiesContext; 

    public productRepository() 
    { 
     _productEntitiesContext = new T(); 
    } 

    public productRepository(T productContext) 
    { 
     _productEntitiesContext = productContext; 
    } 
} 
+0

Danke. Damit definieren Sie einen generischen Typ T. Ich möchte stattdessen etwas wie eine Schnittstelle definieren, wie IProductRepository, aber für den Kontext. – CiccioMiami

1

nicht sicher, was ist das Problem in Hartcodierung ProductEntities hier - ProductRepository scheint ohnehin Produkte spezifische Implementierung zu sein.

Wenn Sie ProductEntities in Ihrem Repository injizieren w/o Abhängigkeiten auf es zu nehmen, dann können Sie wie IProductEntities eine Markierungsschnittstelle erstellen und implementieren, dass in ProductEntities

public interface IProductEntities { } 

public partial class ProductEntities : IProductEntities { } 

Denken Sie daran, obwohl ProductEntities eine generierte Klasse ist, Sie können immer noch Code hinzufügen, weil es teilweise (als Randnotiz, wenn es nicht partiell war, dann könnte man einfach davon geerbt haben)

Sie möchten möglicherweise einige Methoden zu IProductEntities Schnittstelle hinzufügen, wenn Sie wirklich denken g umschaltbarer Datenkontexte. Allerdings bezweifle ich, dass es notwendig wäre, den Kontext zu wechseln, und ich bin unsicher, wer eine alternative Implementierung bereitstellen wird.

Da ein solches Repository-Muster sowieso den Datenzugriff abstrahiert, sieht man auf diese Weise keinen Wert im abstrahierenden EF-Kontext. Wenn Sie morgen einen anderen OR-Wrapper (wie NHibernate) verwenden möchten, können Sie wahrscheinlich eine andere IProductRepository Implementierung bereitstellen, die einen anderen OR-Mapper verwendet.

+1

Ok danke, ich habe mich auch gefragt, ob es sich lohnt, den Kontext zu abstrahieren. Ich dachte, es wäre eine Schnittstelle bereits definiert, da es nicht der Fall ist, werde ich es so lassen wie es ist – CiccioMiami

1

Wenn Sie sich für eine weitere Ebene des Abstracts interessieren, könnten Sie Arbeitseinheit und IoC betrachten, es gibt viele Beispiele für Stackoverflow. Die Beispiele für linq-to-sql gelten auch für das Entity-Framework. Ich habe das über einige Projekte mit dem Entity-Framework persönlich umgesetzt. Wenn Sie interessiert sind, lohnt es sich, in den untenstehenden Links über Arbeitseinheit und IoC zu lesen.

DataContext, Repositories and Unit of Work

http://elegantcode.com/2009/12/15/entity-framework-ef4-generic-repository-and-unit-of-work-prototype/

http://blogs.msdn.com/b/kylemc/archive/2011/08/18/unit-testing-a-wcf-ria-domainservice-part-2-the-repository-pattern.aspx

hoffentlich hilft dies.