Asp.net mvc 如何使用Ninject将具有相同接口的不同存储库对象传递到我的服务层?

Asp.net mvc 如何使用Ninject将具有相同接口的不同存储库对象传递到我的服务层?,asp.net-mvc,unit-testing,repository,ninject,Asp.net Mvc,Unit Testing,Repository,Ninject,所以我在过去遇到过这种困惑,并通过不使用Ninject解决了它。现在我正在重做我的站点,我的Ninject似乎又很方便了,但我把自己弄糊涂了。再说一遍 我有一个使用存储库模式的MVC3项目。目前,my Home Controller创建了一些对象,如OrderRepository.cs、CustomerRepository.cs,并将它们发送到名为OrderService.cs和CustomerService.cs的服务。我有一个测试项目,可以用来发送FakeOrderRepository.cs

所以我在过去遇到过这种困惑,并通过不使用Ninject解决了它。现在我正在重做我的站点,我的Ninject似乎又很方便了,但我把自己弄糊涂了。再说一遍

我有一个使用存储库模式的MVC3项目。目前,my Home Controller创建了一些对象,如OrderRepository.cs、CustomerRepository.cs,并将它们发送到名为OrderService.cs和CustomerService.cs的服务。我有一个测试项目,可以用来发送FakeOrderRepository.cs和FakeCustomerRepository.cs。在我完成项目时,这对于单元测试非常方便

然而,我意识到,通过在控制器和单元测试中声明存储库,我正在建立对这些对象的依赖关系。我想做的是不传递任何存储库,让我的服务层使用Ninject说“哦,看,IOrderRepository在我的构造函数中,我最好去获取OrderRepository”

我上一次遇到的问题是,虽然我可以将OrderRepository绑定到构造函数中的任何实例或IOrderRepository,并在我的Global.ascx中将两者绑定在一起,但这似乎让我的单元测试变得非常困难。除非每次运行测试时,我都使用希望传入的对象(在本例中为FakeOrderRepository.cs)切换Global.ascx中的每个绑定,否则我真正的存储库将传入。我如何让我的测试项目和控制器在使用同一IORDrepository接口时通过不同的存储库

嗯,对一些可能很简单的事情的详细解释。我觉得我想得太多了,只是错过了一些关键的理解


tldr:我如何在服务层中拥有构造函数,并使用Ninject从控制器和单元测试中传入不同的存储库对象。

在服务类中使用构造函数注入来注入存储库是有意义的,您可以从global.asax进行设置

要使单元测试正常工作,您有两个选项:

  • 在测试中设置与假存储库的绑定。换句话说,在测试设置方法中创建不同的NInject模块/内核。如果这些只是控制器测试,那么global.asax中的绑定将不适用,因此您必须设置备用绑定或手动设置依赖项(这是第二个选项)

  • 使用构造函数注入将服务类注入控制器,并让NInject在运行时通过重写控制器工厂来处理此问题。然后在单元测试中,您可以创建服务类,手动伪造存储库,并通过其构造函数将服务对象传递给控制器

  • 我发现本文有助于理解如何将NInject集成到MVC项目中:

  • 继续尽可能多地使用ctor注入,并让所有内容声明其依赖性并尽可能减少责任

  • 不要在你的测试环境中使用Ninject-这应该是没有必要的-如果你最终在那个地方,你已经把它弄得太复杂了

  • 假设您对ASP.NET MVC 3使用Ninject,您应该


  • 啊,那就有道理了。当我做测试时,只要把Ninject从等式中去掉,就很容易设置。我想我是想在太多的地方使用Ninject。为这篇文章干杯,链接还包括了我遇到的其他一些问题:)