2016-11-16 1 views
0

Je suis nouveau à la fois pour Ninject et le Vita ORM (vita docs) et j'ai juste des problèmes à venir avec une stratégie de liaison pour l'injection de dépendance et j'apprécierais vraiment toute aide. Tout d'abord, mon application en trois couches, à savoir la couche de données (en utilisant Vita ORM donc essentiellement une classe EntityApp unique similaire à dbContext pour EF), puis j'ai une couche de service avec des interfaces bien définies (et implémentations existantes en utilisant mon modèle de dépôt actuel en utilisant dapper.net) et enfin une simple application web MVC avec des contrôleurs appelant à la couche de service. Actuellement, j'utilise une intection de constructeur ninject pour injecter le repo dans le service et le service dans le contrôleur et les évaluer en conséquence. Cela fonctionne très bien car tout est piloté par une interface et il n'y a pas de contexte partagé entre les services/référentiels. Mais maintenant avec l'introduction d'un "contexte d'entité", j'ai besoin de créer le contexte une fois dans l'application (donc la portée de singleton) et je voudrais par exemple ouvrir une nouvelle session par requête et la transmettre à n'importe quelle couche de service les objets qui le nécessitent. En plus de cela, l'ORM doit être initialisé au démarrage de l'application (ou je suppose que cela peut être fait paresseusement, mais au démarrage de l'application serait mieux)Bind Vita ORM en utilisant Ninject

Voici un code généré par vita pour initialiser l'ORM Comme vous pouvez le constater, ils initialisent et définissent une variable statique qui fait référence au conteneur de contexte. Comme on peut également le voir ci-dessus, vous devez appeler le var session = App.OpenSession(); pour travailler avec le contexte, donc j'espérais créer une session par requête et ensuite injecter cette session dans les développeurs d'objets de service.

Voici donc ce que je l'ai fait jusqu'à présent

/*Map the Vita ORM session into the request scope*/ 
kernel.Bind<MyEntities>().ToSelf().InSingletonScope(); 

Je suppose que appellera la contructor, et à l'intérieur là, j'ai initialisé le contexte correctement (et cela devrait aussi être appelé une seule fois)

puis dans les objets de service que je veux faire quelque chose comme ça

ici est le impl service

private IEntitySession _Session { get; set; } 

public VitaSettingsServiceImpl(IEntitySession Session) 
{ 
    _Session = Session; 
} 

Et voici ma tentative d'injection de cet objet de la session ...

kernel.Bind<ISettingsService>().To<VitaSettingsServiceImpl>().InRequestScope().WithConstructorArgument("Session", [WANT TO CALL MYENTITIES.OpenSession() HERE]); 

Comme vous pouvez le voir est que la dernière liaison qui me estompe? comment lier un paramètre d'objet contructor à un appel de méthode sur un objet lié singleton existant?Comme je l'ai dit au début, je suis très vert à ce sujet et peut-être que je vais à ce sujet tout faux, mais j'ai parcouru le web et ne peux trouver aucune information concernant ces technologies utilisées ensemble, donc toute aide serait être grandement appréciés

Répondre

0

donc, pour toutes les âmes solitaires pêche à la traîne sur le web avec des problèmes similaires, voici ce que je cam éventuellement avec:

 /*Map the Vita ORM session into the request scope*/ 
     kernel.Bind<SorbetEntities>().ToSelf().InSingletonScope(); 

     /*Map all the services to their respective implementations*/ 
     kernel.Bind<ISettingsService>().To<sorbet.Vita.VitaSettingsServiceImpl>().InRequestScope().WithConstructorArgument("Session", CreateVitaSession); 

et une méthode d'extension statique pour exécuter la méthode qui renverra mon contexte de connexion

private static object CreateVitaSession(IContext context) 
    { 
     return context.Kernel.Get<SorbetEntities>().OpenSession(); 
    } 

Et c'est tout. maintenant je reçois un nouveau contexte de connexion par demande et je suis un campeur heureux