2011-10-11 4 views
3

J'ai récemment créé une bibliothèque de service WCF. Je prévois de l'héberger dans IIS. Puisque je veux réutiliser ma couche de dépôt, j'ai décidé d'utiliser aussi Ninject dans mon service WCF (je l'utilise dans d'autres projets de la solution).Liaisons Ninject Di utilisant un service WCF

J'ai installé les extensions Wcf Ninject. Je l'ai configuré en utilisant NinjectServiceHostFactory dans le fichier svc. J'ai ajouté un fichier Global.asax pour remplacer le CreateKernel() qui hérite de NinjectWcfApplication mais je ne suis pas sûr si j'utilise les liens correctement. J'ai d'abord commencé avec:

Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope(); 

Mais je me suis rapidement rendu compte que cela ne fonctionnait pas puisque aucune donnée n'était enregistrée dans ma base de données. Il semble que le service WCF n'utilise pas le pipeline ASP.NET. Je suis allé de l'avant et a essayé ces deux aussi bien juste pour voir si mes données a été commis à la base de données:

Bind<IUnitOfWork>().To<UnitOfWork>().InThreadScope(); 
Bind<IUnitOfWork>().To<UnitOfWork>().InTransientScope(); 

Pas de chance. Je me suis alors décidé d'essayer:

Bind<IUnitOfWork>().To<UnitOfWork>().InSingletonScope(); 

Cela a fonctionné, mais je ne veux pas que mon contexte de base de données à partager par toutes les demandes qui vient au service WCF. J'ai ensuite fait quelques recherches et trouvé l'approche suivante:

Bind<IUnitOfWork>().To<UnitOfWork>().InScope(c => OperationContext.Current); 

Cela fonctionne mais est-ce correct? Je voulais quelque chose ressemblant à InRequestScope pour une application MVC. Chaque requête au service doit avoir son propre contexte de base de données.

Répondre

3

Je vous suggère de jeter un oeil à la dernière version du CI-serveur http://teamcity.codebetter.com

Vous avez besoin Ninject, Ninject.Web.Common, Ninject.Extensions.Wcf

Avec cette version, vous pouvez utiliser InRequestScope pour Wcf.

+0

Merci Remo, je vais jeter un coup d'oeil. Mais supposons que je veux juste utiliser Ninject et Ninject.Extensions.Wcf, OperationContext.Current serait quelque chose que vous suggérez d'utiliser comme portée. Surtout si je veux déplacer le service WCF vers un hôte non IIS sur la ligne. – Thomas

+0

Vous avez probablement mal compris. Vous devrez le faire de toute façon si vous voulez utiliser la dernière version de Ninject. Web.cmmon est une dépendance requise pour l'extension wcf même si elle est auto-hébergée. –

1

Je suis nouveau à Ninject, mais je peux vous dire que OperationContext.Current est l'équivalent de HttpContext.Current pour l'application web.

Donc, votre première pensée était d'utiliser .InRequestScope(); (ce qui équivaut à .InScope(c => HttpContext.Current);)

donc je suppose que l'utilisation .InScope(c => OperationContext.Current); pour WCF est assez correct.

+1

Rien de vraiment faux avec cela, je voulais juste souligner qu'il existe aussi un mode dans WCF, où il se faufile sur un 'HttpContext.Current', mais en général' OperationContext.Current' est juste. Notez que la recommandation de @Remo Gloor est la voie à suivre car elle enveloppe ces choses, traitant proprement des scénarios comme les applications mixtes WCF/Web, que vous ayez demandé à WCF de créer un HttpContext ou non (par opposition à maintenir deux complètement contextes différents). –