我正在研究使用 asp.net mvc 作为示例的应用程序架构。我在网站 metanit 上学习。在那里,在关于洋葱架构的示例中,在控制器中创建了一个存储库接口的实例。这是元尼特代码:
IBookRepository repo;
IOrder order;
public HomeController(IBookRepository r, IOrder o)
{
repo = r;
order = o;
}
public ActionResult Index()
{
var books = repo.GetBookList();
return View();
}
但是同样成功,您可以创建存储库本身的实例(类的实例),并且会得到相同的结果:
BookRepository repo;
Order order;
public HomeController(BookRepository r, Order o)
{
repo = r;
order = o;
}
public ActionResult Index()
{
var books = repo.GetBookList();
return View();
}
那有什么区别呢?创建类的实例或接口的实例。你能解释一下吗?
在当前级别满足您的应用程序的需求- 没有区别。“如果它叫起来像鸭子,游得像鸭子,那它就是鸭子。”
当您需要实现不同的行为时,这将很重要。然后你创建一个实现相同接口的新类——并且在你承诺使用具有某个接口的类的所有地方,你可以使用任何实现该接口的类。
应用程序中最常见的用途之一是用于单元测试目的。
在测试中,您创建了一个控制器,但您没有传递一个可以访问真实数据库的真实存储库,而是传递了一些可以“假装”为您的控制器的存储库的类。
例如,您可以将书籍存储库视为可以返回书籍列表的东西:
在带有测试的项目中,创建一个简单的实现:
有一些测试库可以自动创建这些存根,但它们还需要知道它们正在模拟哪个接口。
在测试中,使用测试类检查控制器的方法。
如果您使用特定类的名称来做到这一点,要么是不可能的,要么会导致该类过度和不必要的复杂化。此外,在专门框架的帮助下,您可以确保运行某个方法并在测试等中保证这一点。
评论中提出的问题示例: