2008-08-30 28 views
6

Je cherche à pousser mon modèle de domaine dans une API WCF Service et je voulais avoir quelques réflexions sur les techniques de chargement paresseux avec ce type d'installation.Chargement par chargement avec un modèle de domaine de service WCF?

Des suggestions lors de cette approche?


quand je mis en œuvre cette technique et pas dans mon application, juste avant que le serveur retourne ma liste, il touche le get de chaque propriété qui est censé être paresseux chargement ... chargé Ainsi hâte. Pourriez-vous expliquer ce problème ou proposer une solution?

Edit: Il appears vous pouvez utiliser l'attribut XMLIgnore afin qu'il ne soit pas regardé pendant la sérialisation .. encore la lecture sur ce bien

Répondre

3

Comme pour toute architecture de communication à distance, vous voulez éviter le chargement d'un graphe d'objet complet "en bas du fil" d'une manière incontrôlée (sauf si vous avez un petit nombre d'objets).

Le Wikipedia article a les techniques standard assez bien résumées (et en C# aussi!). J'ai utilisé à la fois des fantômes et des détenteurs de valeur et ils fonctionnent plutôt bien.

Pour mettre en œuvre ce type de technique, assurez-vous de séparer strictement les préoccupations. Sur le serveur, vos classes d'implémentation de contrat de service doivent être les seuls bits du code qui fonctionnent avec les contrats de données. Sur le client, la couche d'accès au service doit être le seul code qui fonctionne avec les proxys. Cette superposition vous permet d'ajuster la façon dont le service est implémenté de manière relativement indépendante des couches d'interface utilisateur appelant le service et le niveau métier appelé. Cela vous donne également la moitié des chances de tests unitaires!

4

Ne faites pas de chargement paresseux sur une interface de service. Définissez les DTO explicites et consommez-les en tant que vos contrats de données dans WCF.

Vous pouvez utiliser NHibernate (ou d'autres ORM) pour extraire correctement les objets dont vous avez besoin pour construire les DTO.

+0

Je suis coincé dans le monde de ado.net seulement ... une chance que vous pourriez fournir un échantillon de cette approche que vous avez mentionné? –

+1

Fondamentalement, vous devez créer un ProxyCollection, qui hérite de IList ou ICollection, et cela doit être capable de garder une trace de la commande pour charger les éléments. lors de l'accès à l'un des membres, exécutez d'abord la commande pour remplir la liste. –

1

Vous pouvez essayer d'utiliser quelque chose basé sur REST (par exemple ADO.NET Data Services) et l'intégrer de manière transparente dans votre code client.