Ninject无法正确找到并绑定到存储库

时间:2014-12-04 14:47:28

标签: c# asp.net-mvc ninject

这是令人沮丧的,并且阻止我继续阅读ASP.NET MVC,因为剩下的主题正在建立在这一篇:我正在关注Adam Freeman's book Pro ASP.NET MVC 5.0本书,我相信你们中的许多人也研究过它。所以我完成了第7章,这不起作用。我可以调出网站,但页面右侧没有显示任何产品。

据我所知,这是我发现的: 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 error

获得ProductsController

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

1 个答案:

答案 0 :(得分:1)

Ninject在这段代码中的任务是找到IProductsRepository的实例,并使用此存储库创建一个新的ProductController实例。

  1. 您的NinjectDependencyResolver包含kernel.Bind<IProductsRepository>().To<EFProductRepository>();。因此,您已将服务接口绑定到实体框架实现。
  2. 您的ProductController取决于IProductsRepository个实例。如果没有存储库,它将不会创建一个。
  3. 如果Ninject以某种方式无法解析存储库实例,您将获得一个包含详细错误信息的ActivationException。我假设你没有收到这个错误。
  4. 如果Ninject会注入null(默认情况下不会这样做而且不推荐使用),您会在NullReferenceException方法中获得List,我认为您不会得不到。
  5. 很明显,一切都按预期工作,Ninject正在注入一个存储库实例。 Skip and Take也很好看。
  6. 我下载了你的项目,在app_Data的mdf数据库文件中的products表中添加了一些项目,它立即生效了。那边有调试问题。