Implementieren von WCF Data Service mit dem Repository-Pattern
Sind wir mit dem repository-pattern in unsere ASP.NET MVC 3-Anwendung. Dies bedeutet, dass, obwohl wir EF 4.1 Code Erste, der den Zugriff auf die Daten im backend, alle MVC-Controller zu tun, dass mittels eines generischen repository-Klasse anstatt direkt über die DbContext-Unterklasse.
Vereinfachte code-snippet:
public class MyEntityContext : DbContext, IMyEntityContext
{
public IDbSet MyEntities { get; set; }
...
}
public class MyEntityRepository : IMyEntityRepository
{
private IMyEntityContext _context;
public IQueryable<MyEntity> MyEntities
{
return _context.MyEntities;
}
...
}
public class MyEntityController : Controller
{
private MyEntityRepository _repository;
...
}
Verwenden wir Schnittstellen und dependency injection für jede Abhängigkeit. Es funktioniert einwandfrei. Sieht nett aus, nicht wahr? Nun aber zum Nachteil:
Bieten wir auch einen WCF Data Service (CTP Unterstützung von Code First), um den Zugriff auf die Entitäten. Wollen wir verwenden das repository aus, dass der service auch. Aber dies scheint schwierig. Bei der Verwendung der MyEntityContext
direkt, der service sieht wie folgt aus:
public class MyEntityService : DataService<MyEntityContext>
{
public static void InitializeService(DataServiceConfiguration config)
{
config.SetEntitySetAccessRule("MyEntities", EntitySetRights.All);
}
}
Aber wenn ich versuche, ersetzen Sie die MyEntityContext
durch das repository, es gibt zwei Probleme:
- Der genannten Art für die Allgemeine
DataService<..>
werden muss, um eine Klasse mit einem Standardkonstruktor, der bricht die hübschen design-by-contract " und " dependency injection design. - Es scheint sogar, dass die Art zur Verfügung gestellt wurde, um eine
DbContext
Klasse: ich habe versucht, und verwendet dieMyEntityRepository
statt, die aber fehlgeschlagen ist (siehe details).
Scheine ich verloren... Kann mir jemand dazu bringen mich wieder auf die richtige Spur?
Details:
Meine erste war:
public class MyEntityService : DataService<MyEntityRepository>
{
...
Jedoch, wenn der Dienst aufgerufen wird, schlägt fehl mit den folgenden Fehlermeldung:
Der server hat einen Fehler bei der Verarbeitung der Anfrage. Die Ausnahmemeldung lautet 'Auf Daten Kontext geben 'MyEntityRepository', es ist ein top-IQueryable Eigenschaft 'MyEntities', deren element-Typ nicht ein entity-Typ. Stellen Sie sicher, dass die IQueryable Eigenschaft der entity-Typ oder geben Sie die IgnoreProperties-Attribut auf die Daten Kontext geben, um diese Eigenschaft ignorieren.'.
Ich habe versucht, die folgenden Schritte aus, um dieses Problem zu lösen, aber nicht bekommen, um loszuwerden, diese Fehlermeldung:
- Hinzufügen eines
[DataServiceKey("MyEntityId")]
zu MyEntity, wo MyEntityId ist der richtige Schlüssel ist Eigentum des Unternehmens. - Austauschen der Art der
Repository.MyEntities
durchIDbSet
stattIQueryable
.
BTW: Die folgenden Beiträge sind nicht Duplikate:
- WCF-Repository-Service pattern mit dem entity framework
- Service-Ebene/Repository Pattern
- Beste Art der Umsetzung Repository-Muster?
- webservices mit dem repository-pattern in c# und WCF?
- WCF Service-design-Muster
ist eine POCO-Klasse dient als eine Entität. Es spiegelt sich in der Datenbank, und EF erfolgreich Karten. Das einzige, was nicht funktioniert, wird die DataService.
Ich denke, zu verwenden DataService<>, MyEntity muss Erben von Entity.
FYI: zumindest so aus WCF Data Services 5.0 und EF 5.0 (4.3 auf .NET 4.0) das funktioniert out-of-the-box. Ich mache etwas ähnliches. In der Tat, meine DbContext-Derivat ist wirklich nur ein Ort für den code-first-fließend konfiguriert Modell, ohne
IQueryable
oder DbSet
Eigenschaften, und diese funktioniert immer noch. Diese aktualisierte tools sind verfügbar, um die toolsets zur Verfügung, wenn die Frage gestellt wurde, so würde dies scheint umstritten zu sein.
InformationsquelleAutor chiccodoro | 2011-07-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Warum wollen Sie verwenden-repository? Sie haben nach Kontext verwenden. Erstellen Sie keine Zwiebel Architektur, nur weil Sie verwenden möchten Muster. WCF data service bereits behandelt alles, was Sie brauchen selbst. Nein sorry, es bietet manchmal sogar mehr (z.B. Abfangjäger).
Durch die Verwendung von benutzerdefinierten Repositorys, die Sie verschieben, um Reflexion-provider-Datenquelle. Wenn Sie auch planen, modifizieren Sie Ihre Einheiten durch die WCF-Daten-Dienst, der auch gegen Ihre repository, da Reflexion Anbieter nur gelesen, es sei denn, es implementiert auch
IUpdateable
. Überprüfen Sie auch Regeln für die Reflexion Anbieter.Btw. WCF Data Services in .NET 4 nicht unterstützt DbContext-direkt-support ist nur in CTPs der nächsten version) aber es gibt workaround für das. Der link ist für die alte CTP. In der aktuellen version gibt es nicht
UnderlyingContext
Eigentum, sondern Sie könnenIObjectContextAdapter
zu bekommenObjectContext
.Wie Sie sehen, auch im letzten link geben, sofern der service nicht benötigen, haben default-Konstruktor - es ist an Ihnen, welchen Konstruktor Sie verwenden, wenn Sie Daten-Quelle. Wenn Sie brauchen, dependency injection, müssen Sie wahrscheinlich zu prüfen, die Art und Weise, wie zu injizieren, der direkt auf den Dienst selbst (z.B. hier für Einheit und einfachen WCF) und verwenden injiziert Daten in
CreateDataSource
.So verbringen Sie eine Woche zu erstellen nutzlose Abstraktion (auch als overarchitecting) für WCF Data Service, anstatt es wie ist? Die Ausgaben in der Woche etwas zu schaffen, das keine zusätzlichen geschäftlichen nutzen und die auch nicht mehr wartbar ist eine Verschwendung. Data service wie sein name schon andeutet ist eine direkte Kommunikation mit dem data access layer.
Also, wenn wir mit der Umsetzung beginnen einige Validierung, Genehmigung oder security-trimming Logik, wir haben immer zu tun Sie es zweimal? Einmal für den Controller, einmal für den service? Was ist der ganze Sinn der Verwendung eines repository dann?
Sobald Sie anfangen, tun es vielleicht, aber dein Beispiel einfach macht
IQueryable
. Die Frage ist, wenn die Sicherheits - (= cross-cutting) ist ein Teil des repository? Meiner Meinung nach ist es auch nicht. Ganze Sinn-repository abstrahiert data access - pure data access."Sie haben den Kontext, so verwenden Sie es. Erstellen Sie keine Zwiebel Architektur, nur weil Sie möchten, verwenden Sie ein Muster." -aber was ist, wenn ich möchte aufzeigen, business-Logik-Funktionen (nicht direkt EF-Modell) und profitieren von WCF-data services (OData Abfragen, stark typisiert .NET-client-code, etc.)?
InformationsquelleAutor Ladislav Mrnka
Hier ist, wie man einen WCF Data Service mit welchem Muster auch immer Sie verwenden, überhaupt keine.
Erste Schritte Mit OData-Teil 2: Gebäude mit einem OData-Services aus einer Beliebigen Datenquelle
Nur sicherstellen, dass Ihre Einheit, poco, Modell oder was auch immer hat eine Eigenschaft public int ID , oder hat diese Klasse die annotation zur Verfügung gestellt von der
System.Data.Services
Montage in derSystem.Data.Services
namespace:
Dadurch wird es erkennbar als ein entity-Typ durch den WCF Data Service.
Als andere haben darauf hingewiesen, obwohl, so stellen Sie sicher, dass das hinzufügen noch einer anderen Ebene in dein stack ist eine gute Entscheidung.
InformationsquelleAutor Jerther