2011-02-10 7 views
2

J'essaie d'en apprendre un peu plus sur MVC et j'ai rencontré un problème lors de l'utilisation de Ninject. Je souhaite lier des référentiels, mais continuez à recevoir l'erreur "Référence de l'objet non définie sur une instance d'un objet".ASP MVC 2 Ninject

J'ai créé mon NinjectControllerFactory:

public class NinjectControllerFactory : DefaultControllerFactory 
{ 
    // A Ninject "kernel" is the thing that can supply object instances 
    private IKernel kernel = new StandardKernel(new SportsShopServices()); 

    // ASP .NET MVC calls this to get the controller for each request 
    protected override IController GetControllerInstance(RequestContext context, Type controllerType) 
    { 
     if (controllerType == null) 
      return null; 
     return (IController) kernel.Get(controllerType); 
    } 

    // Configure how abstract sevice types are mapped to concrete implementations 
    private class SportsShopServices : NinjectModule 
    { 
     public override void Load() 
     { 
      Bind<IProductRepository>().To<SqlProductsRepository>() 
       .WithConstructorArgument("connectionString", 
       ConfigurationManager.ConnectionStrings["AppDb"].ConnectionString); 
     } 
    } 
} 

et mon contrôleur:

public class ProductsController : Controller 
{ 
    private IProductRepository productsRepository; 

    // Constructor used with Ninject 
    public ProductsController(IProductRepository _productsRepository) 
    { 
     this.productsRepository = _productsRepository; 
    } 

    public ViewResult List() 
    { 
     return View(productsRepository.Products.ToList()); 
    } 
} 

J'ai modifié le fichier web.config pour fournir la chaîne de connexion db et le fichier Global.asax Application_Start () méthode à inclure:

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

Je travaille sur un exemple e du livre PRO ASP .NET MVC 2 mais ne peut tout simplement pas obtenir ce travail, essayé toute la journée.

+0

Avez-vous essayé re-construction? De plus, avez-vous la classe "SqlProductsRepository" dans votre solution? – donhack

+0

Ouais essayé de reconstruire. SqlProductsRepository est là, son utilisé pour construire et retourner une table de produits de la base de données. – Apollo

Répondre

3

Si vous voulez simplement une fonctionnalité ninject out-out-the-box, vous en faites trop en créant votre propre fabrique de contrôleurs.

tout ce que vous avez besoin est ce qui suit dans global.asax

public class MvcApplication : NinjectHttpApplication 
{  
    protected override IKernel CreateKernel() 
    { 
     var modules = new INinjectModule[] 
     { 
      new ServiceModule() 
     }; 

     return new StandardKernel(modules); 
    } 

    protected override void OnApplicationStarted() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     RegisterRoutes(RouteTable.Routes); 

     RegisterAllControllersIn(Assembly.GetExecutingAssembly()); 

    } 


    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}");    

     routes.MapRoute(
      "Default",            // Route name 
      "{controller}/{action}/{id}",       // URL with parameters 
      new { controller = "Home", action = "Index", id = "" } // Parameter defaults 
     ); 

    } 

    internal class ServiceModule : NinjectModule 
    { 
     public override void Load() 
     { 
      // controllers 
      this.Bind<Controllers.AccountController>().ToSelf(); 
      this.Bind<Controllers.HomeController>().ToSelf(); 

      // Repository 
      Bind<Controllers.IFormsAuthentication>().To<Controllers.FormsAuthenticationService>(); 
      Bind<Controllers.IMembershipService>().To<Controllers.AccountMembershipService>(); 
     } 
    } 
} 
+0

C'est exactement ce que j'ai fini par faire. Je suis passé d'utiliser Castle Windsor avec une usine de contrôleur (c'est-à-dire la méthode prescrite dans la première version de ce livre de Sanderson) à exactement ce que vous avez décrit ci-dessus. Les choses ont bien fonctionné jusqu'à présent. Non pas qu'il y ait quelque chose de mal avec la méthode Castle/Factory - j'ai changé pour une toute autre raison. – Mayo

+0

Merci pour la réponse. J'ai créé l'usine de contrôleur car c'est ce qu'il suggère dans le livre. Je vais essayer et vous faire savoir comment je m'entends. Merci. – Apollo

+0

Merci l'homme, a travaillé un charme! – Apollo