Mettre en œuvre Service de Données WCF en utilisant le Modèle de Référentiel

Nous utilisons le modèle de référentiel dans notre ASP.NET MVC 3 application. Cela signifie que, même si nous utilisons EF 4.1 le Premier Code pour accéder aux données dans le back-end, tous les contrôleurs MVC faire que par l'intermédiaire d'un référentiel générique de la classe plutôt que directement au-dessus de la DbContext sous-classe.

Simplifié extrait de code:

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;
    ...
}

Nous utilisons des interfaces et de l'injection de dépendances pour chaque dépendance. Il fonctionne très bien. L'air bien, n'est-ce pas? Mais maintenant, pour la mise en garde:

Nous fournissons également un Service de Données WCF (CTP soutenir le Premier Code) pour accéder aux entités. Nous voulons utiliser le référentiel dans ce service, aussi. Mais cela semble difficile. Lors de l'utilisation de la MyEntityContext directement, le service ressemble à ceci:

public class MyEntityService : DataService<MyEntityContext>
{
    public static void InitializeService(DataServiceConfiguration config)
    {
        config.SetEntitySetAccessRule("MyEntities", EntitySetRights.All);
    }
}

Mais quand j'ai essayer de remplacer les MyEntityContext par le référentiel, il y a deux problèmes:

  1. Le type spécifié pour le générique DataService<..> doit être une classe avec un constructeur par défaut, qui rompt la jolie conception par contrat injection de dépendance et de design.
  2. Il semble même que le type fourni doit être un DbContext classe: j'ai essayé et utilisé le MyEntityRepository à la place, mais a échoué (voir les détails).

Me semble perdu... quelqu'un Peut me ramener sur la bonne piste?


Détails:

Mon premier aller a:

public class MyEntityService : DataService<MyEntityRepository>
{
    ...

Toutefois, lorsque vous appelez le service, il échoue avec le message d'erreur suivant:

Le serveur a rencontré une erreur de traitement de la demande. Le message d'exception est " Sur le contexte de données de type 'MyEntityRepository", il est l'un des principaux IQueryable propriété "MyEntities" dont le type d'élément n'est pas un type d'entité. Assurez-vous que le IQueryable de la propriété est de type d'entité ou d'indiquer le IgnoreProperties l'attribut dans le contexte de données type d'ignorer cette propriété.'.

J'ai essayé les étapes suivantes pour résoudre ce problème, mais ne pas se débarrasser de ce message d'erreur:

  • L'ajout d'un [DataServiceKey("MyEntityId")] à MyEntity, où MyEntityId est la clé correcte de la propriété de l'entité.
  • De remplacer le type de Repository.MyEntities par IDbSet au lieu de IQueryable.

BTW: Les courriers suivants sont pas doublons:

Qu'est-ce que MyEntity? Apparemment ce n'est pas un "type d'entité". Avez-vous essayé d'utiliser le "IgnoreProperties" attribut?
est un POCO de classe qui sert comme une entité. Elle se reflète dans la base de données, et EF avec succès des cartes. La seule chose qui ne fonctionne pas est l'instance DataService.
Je pense que pour utiliser DataService<>, MyEntity doit hériter de l'Entité.
Pour info: À moins que des Services de Données WCF 5.0 et EF 5.0 (4.3 sur .NET 4.0) cela fonctionne out-of-the-box. Je suis en train de faire quelque chose de similaire. En fait, mon DbContext dérivé est vraiment juste un locus pour le code-première couramment configuré modèle, sans IQueryable ou DbSet propriétés, et cela fonctionne encore. Ces mise à niveau des outils sont à la disposition de l'ensemble des outils disponibles lorsque la question a été posée, donc cela semble être discutable.

OriginalL'auteur chiccodoro | 2011-07-19