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:
- 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. - Il semble même que le type fourni doit être un
DbContext
classe: j'ai essayé et utilisé leMyEntityRepository
à 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
parIDbSet
au lieu deIQueryable
.
BTW: Les courriers suivants sont pas doublons:
- WCF Service de Référentiel modèle avec entity framework
- La Couche De Service/Modèle De Référentiel
- La meilleure façon de mettre en œuvre un Modèle de Référentiel?
- webservices avec un modèle de référentiel en c# WCF?
- Service WCF modèle de conception
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
Vous devez vous connecter pour publier un commentaire.
Pourquoi voulez-vous utiliser référentiel? Vous avez contexte afin de l'utiliser. Ne créez pas d'oignon architecture juste parce que vous voulez le profil d'utilisation. WCF data services prend en charge tout ce dont vous avez besoin. Non désolé, il offre parfois même plus (par exemple intercepteurs).
Par l'aide personnalisée référentiel vous vous déplacez à la réflexion fournisseur de la source de données. Si vous aussi vous envisagez de modifier votre entités par le biais de service de données WCF qui est aussi à l'encontre de votre référentiel, car la réflexion fournisseur est en lecture seule, sauf si elle met également en œuvre
IUpdateable
. Vérifiez également règles pour la réflexion fournisseur.Btw. Les Services de Données WCF .NET 4 ne prend pas en charge DbContext directement (qui n'est en Ctp de la version à venir), mais il est solution de contournement pour que. Le lien est pour les vieux CTP. Dans la version actuelle il n'y a pas
UnderlyingContext
de la propriété, mais vous pouvez utiliserIObjectContextAdapter
pour obtenirObjectContext
.Comme vous pouvez le voir dans le dernier type de lien fourni le service n'a pas besoin d'avoir de constructeur par défaut - il est à vous ce constructeur vous utilisez lors de la création de la source de données. Si vous avez besoin d'injection de dépendance, vous aurez probablement à vérifier la façon d'injecter directement le service lui-même (par exemple ici pour l'Unité et la plaine de la WCF) et l'utilisation injecté de données dans
CreateDataSource
.Si vous passerez une semaine pour créer abstraction inutile (également appelé overarchitecting) pour le Service de Données WCF au lieu de l'utiliser? Les dépenses de semaine pour créer quelque chose qui n'a pas toute la valeur de l'entreprise et qui ne le rend pas plus facile à gérer est un déchet. Service de données comme son nom l'relents est pour la communication directe avec couche d'accès aux données.
Donc, si nous commençons la mise en œuvre de la validation de certains, de l'autorisation ou de la sécurité de la coupe de la logique, nous devons toujours faire deux fois? Une fois pour les contrôleurs, une fois pour le service? Quel est le point de l'ensemble de l'aide d'un référentiel?
Une fois que vous commencer à le faire, peut-être, mais votre exemple simplement expose
IQueryable
. La question est de savoir si la sécurité (= transversale) est la partie du référentiel? À mon avis, il ne l'est pas. Tout point de dépôt est l'abstraction d'accès aux données - pur d'accès aux données."Vous avez contexte afin de l'utiliser. Ne créez pas d'oignon architecture juste parce que vous voulez le profil d'utilisation." -mais si je veux exposer la logique d'entreprise fonctions (pas directement le modèle EF) et encore bénéficier de services de données WCF (OData requêtes, fortement typé .NET code client, etc.)?
OriginalL'auteur Ladislav Mrnka
Voici comment faire pour un Service de Données WCF avec quel que soit le modèle que vous utilisez, même pas du tout.
Mise en route Avec OData Partie 2: la Construction d'un des Services OData de Toute Source de Données
Assurez-vous que votre entité, poco, de modèle ou de tout ce qui a un bien public int ID , ou a cette classe d'annotation fournis par le
System.Data.Services
assemblée dans leSystem.Data.Services
namespace:
Cela rendra reconnaissable comme un type d'entité par le Service de Données WCF.
Comme d'autres l'ont souligné, si, assurez-vous que l'ajout d'une autre couche dans votre pile est une bonne décision.
OriginalL'auteur Jerther