2010-07-15 1 views
1

J'ai un projet ASP.NET MVC qui utilise un projet de services pour passer par un ensemble d'interfaces (projet) vers un projet de référentiel.en utilisant Ninject avec ASP.NET MVC et la couche de services

Je suis légèrement confus où utiliser Ninject. Il me semble logique d'inclure mon Ninject dans la couche services car c'est là que j'interagis avec les interfaces.

Ma question est de savoir comment cela serait mis en œuvre? Aussi, comment d'autres personnes ont-elles implémenté cela?

Répondre

4

Dans votre projet Services, vous devez créer une classe dérivée de NinjectModule et remplacer la méthode Load; La responsabilité de cette classe est d'enregistrer vos dépendances avec Ninject.

public class ServiceModule : NinjectModule 
{ 
    public override void Load() { 
     Bind<IAccountService>().To<AccountService>(); 
    } 
} 

Ensuite, vous voudrez créer une classe Application qui hérite de NinjectHttpApplication. Remplacer la méthode CreateKernel et enregistrer le NinjectModule de votre projet Services (ainsi que tous les autres que vous pourriez avoir besoin pour vous inscrire.

public class MvcApplication : NinjectHttpApplication 
{ 
    protected override void OnApplicationStarted() { 
     RegisterRoutes(RouteTable.Routes); 
     RegisterAllControllersIn(Assembly.GetExecutingAssembly()); 
    } 

    protected override IKernel CreateKernel() { 
     var modules = new INinjectModule[] { 
      new MyProject.Services.ServiceModule(), 
      new MyProject.Data.DataModule() 
     }; 

     var kernel = new StandardKernel(modules); 

     return kernel; 
    } 
+0

note, à utiliser NinjectHttpApplication, vous aurez besoin du code d'extension: http://github.com/ninject/ninject.web.mvc –

+0

C'est ce que je aussi recommander... – Haroon

1

Théoriquement, le seul lieu d'utiliser un conteneur de DI est dans la configuration du projet. En le cas d'un projet ASP.NET MVC, qui serait dans la méthode Application_Start de Global.asax Pour mon projet, j'utilise un ControllerFactory basé sur NInject pour instancier les contrôleurs selon les besoins, puis les contrôleurs ont toutes les dépendances dont ils ont besoin dans leurs constructeurs donc NInject les accroche de manière appropriée

mon global.asax:

private static IKernel kernel = new StandardKernel(); 
    protected void Application_Start() 
    { 
     kernel.Bind<IRepository<User>>().To<NHibernateRepository<User>>(); 

     ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory(kernel)); 
    } 

et mon NInjectControllerFactory:

public class NinjectControllerFactory : System.Web.Mvc.DefaultControllerFactory 
{ 
    private IKernel container; 

    public NinjectControllerFactory(IKernel container) 
    { 
     this.container = container; 
    } 

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
    { 
     if (controllerType != null) 
     { 
      IController controller = container.Get(controllerType) as IController; 
      Check.Require(controller, "Could not instantiate controller type: {0}", controllerType.FullName); 
      return controller; 
     } 

     return base.GetControllerInstance(requestContext, controllerType); 
    } 
} 
Questions connexes