2011-05-24 6 views
1

Je veux utiliser Ninject 2 sur Castle Monorail. En cherchant sur google, je n'ai rien trouvé à ce sujet.Intégration de Monorail de Château et de Ninject 2

Je sais qu'il y a Windsor qui peut magiquement s'intégrer avec Monorail, comme Ninject (avec extension MVC) avec ASP.NET MVC.

Quelles mesures dois-je prendre pour intégrer le cadre DI (autre que Windsor) avec Monorail? (Tout lien de site Web, tutoriel, ou exemple de code (de préférence en utilisant Ninject 2))

FYI, j'utilise C#

Répondre

2

Je ne pense pas qu'il y ait une documentation à ce sujet, mais il est vraiment très simple. Il n'y a pas de magie à ça. Puisque MonoRail et Windsor sont des projets complètement distincts, tout ce que vous avez à faire est see how they integrate, alors faites la même chose pour Ninject au lieu de Windsor.

Plus concrètement, commencez par le MonoRailFacility qui est la racine de l'intégration. Au lieu d'une installation de Windsor, vous utiliseriez un module Ninject. Notez qu'il enregistre certains composants: IControllerTree, IWizardPageFactory, etc. Le plus important est IControllerFactory, qui vous permet de résoudre les contrôleurs à partir du conteneur (dans votre cas Ninject). Vous pouvez laisser tous les autres par défaut pour l'instant (par exemple IFilterFactory/DefaultFilterFactory) et les implémenter si nécessaire (c'est-à-dire lorsque vous avez besoin du contrôle de conteneur des filtres).

appellent alors ServiceProviderLocator.Instance.AddLocatorStrategy(new NinjectAccessorStrategy());NinjectAccessorStrategy est une implémentation de IAccessorStrategy qui retourne le noyau Ninject comme Castle.Core.IServiceProviderEx (qui n'est une extension triviale de System.IServiceProvider). Puisque le noyau Ninject implémente déjà IServiceProvider, il est trivial d'écrire un adaptateur pour IServiceProviderEx.

+0

Merci. Je vais essayer ça! –

+0

En faisant cela, j'ai trouvé que NinjectServiceProvider doit utiliser 'kernel.TryGet ()' au lieu de 'kernel.Get ()' pour qu'il renvoie une valeur nulle si un type n'est pas enregistré. Cela déclenche MonoRail pour utiliser l'implémentation par défaut. –