2011-02-10 5 views
2

Я пытаюсь немного узнать о MVC и столкнулся с проблемой при использовании Ninject. Я хочу связать репозитории, но продолжаю получать ошибку «Ссылка на объект, не установленную на экземпляр объекта».ASP MVC 2 Ninject

Я создал свой 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); 
     } 
    } 
} 

и мой контроллер:

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()); 
    } 
} 

Я модифицировал файл Web.config, чтобы обеспечить строку подключения к БД и Global.asax файл Application_Start ():

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

Я работаю над экзаменом e из PRO ASP.NET MVC 2 книги, но просто не может получить эту работу, пробовал весь день.

+0

Пробовали ли вы повторно здание? Кроме того, у вас есть класс «SqlProductsRepository» в вашем решении? – donhack

+0

Да, перепробовал. SqlProductsRepository существует, он используется для создания и возврата таблицы продуктов из базы данных. – Apollo

ответ

3

Если вы просто хотите использовать функциональность ninject out-out-box, вы делаете слишком много, создавая свою собственную фабрику контроллеров.

все, что вам нужно следующее 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

Именно это я и сделал. Я пошел от использования Castle Windsor с фабрикой контроллеров (т. Е. Метод, предписанный в первой версии этой книги Сандерсона) точно так, как вы описали выше. До сих пор все было хорошо. Не то, чтобы что-то случилось с методом Castle/Factory - я переключился на совершенно другую причину. – Mayo

+0

Спасибо за ответ. Я создал фабрику контроллеров, поскольку это то, что он предлагает в книге. Я отдам это и дам вам знать, как я нахожусь. Благодарю. – Apollo

+0

Спасибо, человек, работал очарование! – Apollo

Смежные вопросы