2014-12-04 57 views
0

这太令人沮丧了,并阻止我继续阅读ASP.NET MVC,因为其余的主题都建立在这一个之上:我遵循Adam Freeman's book Pro ASP.NET MVC 5.0这本书,我相信你们中的许多人也研究过它。所以我已经完成了第7章,这是行不通的。我可以调出该网站,但页面右侧没有显示任何产品。Ninject无法找到并正确绑定到存储库

至于我可以在这里调试是我发现: ProductController没有返回的产品,这点我觉得是因为Ninject工作不正常 https://github.com/babakinks/MVCExample/blob/master/SportsStore/SportsStore.WebUI/Controllers/ProductController.cs

public class ProductController : Controller 

{ 
    private IProductsRepository repository; 
    public int PageSize = 4; 

    public ProductController(IProductsRepository productRepository) 
    { 
     this.repository = productRepository; 
    } 

    public ViewResult List(int page = 1) 
    { 
     ProductsListViewModel model = new ProductsListViewModel 
     { 
      Products = repository.Products 
      .OrderBy(p => p.ProductID) 
      .Skip((page - 1) * PageSize) 
      .Take(PageSize), 
      PagingInfo = new PagingInfo 
      { 
       CurrentPage = page, 
       ItemsPerPage = PageSize, 
       TotalItems = repository.Products.Count() 
      } 
     }; 
     return View(model); 
    } 
} 

而且我不认为这是因为我的数据库中没有足够的数据,因为我可以查询它们。

只有一点:我不得不在Global.asax.cs

private void RegisterDependencyResolver() 
    { 
     var kernel = new StandardKernel(); 

     // you may need to configure your container here? 
     //RegisterServices(kernel); 

     DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel)); 
    } 

添加此方法如果我不这样做,我会得到一个parameter-less constructor errorProductsController

如果你想看看,这里是整个事情: https://github.com/babakinks/MVCExample

回答

1

Ninject在这段代码中的任务是找到IProductsRepository和cr的实例在此存储库中使用新的ProductController实例。

  1. 您的NinjectDependencyResolver包含kernel.Bind<IProductsRepository>().To<EFProductRepository>();。所以你已经将服务接口绑定到实体框架实现。
  2. 您的ProductController依赖于IProductsRepository实例。它不会创建一个没有存储库的人。
  3. 如果Ninject以某种方式无法解析存储库实例,则会得到一个ActivationException,其中包含详细的错误信息。我假设你没有得到这个错误。
  4. 如果Ninject将注入null(默认情况下,它不和不推荐),你会在你的List方法,我以为你没有得到任何获得NullReferenceException
  5. 显然,一切都按预期工作,Ninject正在注入一个存储库实例。跳过并采取也看起来不错。

我下载了你的项目,在App_Data的mdf数据库文件的产品表中添加了一些项目,并且它立即生效。你在那边有一个调试问题。

+0

非常感谢您花时间测试应用程序。您能否详细解释一下这个问题:“您那边有一个调试问题。” – Bohn 2014-12-09 20:47:30

+1

@Blake:好吧,我克隆了你的git项目,建立了它,在数据库中放入了一些行,它工作。你确定你有数据吗?请记住,ASP.net正在使用App_Data文件夹中的文件。 – Frank 2014-12-09 20:55:02