2010-08-06 6 views
1

J'essaie d'utiliser NHibenate, Burrow et Ninject.Liaison Nhibernate.Burrow ISession en utilisant Ninject

Je n'arrive pas à être capable de lier l'ISession de Burrow en utilisant ninject.

J'ai actuellement

Bind<ISession>().ToProvider(new BurrowFramework().GetSession()).InRequestScope(); 

Je reçois les erreurs

cannot convert from 'NHibernate.ISession' to 'System.Type' 

The best overloaded method match for 'Ninject.Syntax.IBindingToSyntax<NHibernate.ISession>.ToProvider(System.Type)' has some invalid arguments 

Où suis-je mal?

Répondre

2

Vous voulez sans doute faire:

Bind<ISession>().ToMethod(() => new BurrowFramework().GetSession()).InRequestScope(); 

Jetez un oeil à la documentation ninject - ToProvider fait référence à une interface spécifique qui un mandat de fournisseur ninject, ce qui vous permet de gérer des usines plus complexes proprement (par opposition à ce qui fonctionne presque comme une méthode d'usine en ligne comme ci-dessus). EDIT: J'interprète votre commentaire comme impliquant que vous l'avez essayé mais j'ai découvert que j'avais foiré en supposant qu'il y avait une surcharge de ToMethod où le délégué n'a pas de paramètres, quelles différences subtiles dans la syntaxe des délégués vous confondent. Si ce n'est pas le cas, je l'aurais écrit:

Bind<ISession>().ToMethod(ctx => new BurrowFramework().GetSession()).InRequestScope(); 

Maintenant, résumé rapide de la syntaxe C#:

En C# 2, nous avons eu des délégués anonymes comme suit:

0) ToMethod(delegate {})... 
1) ToMethod(delegate() {})... 
2) ToMethod(delegate(x) {})... 
3) ToMethod(delegate(X x) {})... 
4) ToMethod(delegate(x, y) {})... 
5) ToMethod(delegate(X x, Y y) {})... 

En C# 3, nous pouvons créer lambdas comme suit:

1) ToMethod(() => {})... 
2) Method(name => {})... 
3) ToMethod((X x) => {})... 
4) ToMethod((x, y) => {})... 
5) ToMethod((X x, Y y) => {})... 

qui correspondent à zéro, 1 de tout type, 1 de type X, 2 de tout type, un X suivi d'un Y respectivement

Ils sont tous équivalents - le compilateur génère la même sortie pour chacun. La différence est qu'il n'y a pas d'équivalent de la syntaxe 0 dans la syntaxe lambda.

Je recommande vivement C de # Jon Skeet en profondeur pour faire tout ce genre de choses claires (mais attendez pour la deuxième édition qui est un nombre peu élevé de mois loin)

(Si eu le temps de donner plus de réponse en profondeur regarderait les sources ninject/API et voir si elles sont conformes à toujours ou jamais passer un contexte)

0

Merci Ruben

Pourriez-vous préciser quelque chose pour moi quelle est la différence entre

Bind<ISession>().ToMethod(delegate { return new BurrowFramework().GetSession(); }).InRequestScope(); 

et

Bind<ISession>().ToMethod(arg => new BurrowFramework().GetSession()).InRequestScope(); 

ou

Bind<ISession>().ToMethod((IContext arg) => new BurrowFramework().GetSession()).InRequestScope(); 

Je me serais attendu le premier à ressembler

(delegate(IContext arg){ return new BurrowFramework().GetSession();} 

mais il semble fonctionner alors que cela ne

Bind<ISession>().ToMethod(() => new BurrowFramework().GetSession()).InRequestScope(); 
+0

(Dans le cas où ce n'est pas évident, éditer votre question est une meilleure façon de faire ce retour et/ou des commentaires, mais vous n'avez pas encore le représentant (+1 de la question - aurait dû le faire en premier lieu), mais je m'égare ...). (Répondre via edit ....) –

+0

Donc, résumant basé sur mon édition: premier extrait correspond à 0 ou n paramètres, la deuxième correspond exactement à 1, la troisième est la même que la seconde. Sur le quatrième, '(IContext arg)' peut être omis en utilisant la syntaxe de délégué, pas lambda. Sur le cinquième, le lambda a zéro params, mais aucune surcharge de ToMethod ne correspond à cela. J'espère que c'est clair. Je sais que j'ai répondu à une autre question sur SO qui a une meilleure discussion et des exemples de la différence entre syntaxe lambda et déléguée (ma réponse a souligné que le cas principal où l'on privilégierait la syntaxe lambda est où vous voulez associer 0 ou n déléguer params et ignore les) –

+0

Thanks Ruben J'ai essayé d'éditer ma question/ajouter un commentaire mais pour une raison quelconque il n'y avait aucun moyen. Merci pour la clarification, je vais certainement vérifier le livre de Jon Skeet. Commencer à mettre mes mains dans C#. J'apprécie votre aide. – Jokiliku