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:

  1. 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.
  2. Es scheint sogar, dass die Art zur Verfügung gestellt wurde, um eine DbContext Klasse: ich habe versucht, und verwendet die MyEntityRepository 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 durch IDbSet statt IQueryable.

BTW: Die folgenden Beiträge sind nicht Duplikate:

Was ist MyEntity? Anscheinend ist es nicht ein "entity type". Haben Sie versucht, mit dem "IgnoreProperties" - Attribut?
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

Schreibe einen Kommentar