为什么在 MVP 中使用 Presenter 接口?

Sey*_*avi 5 c# asp.net mvp design-patterns

我将使用Professional ASP.NET Design Patterns学习 MVP模式。在表示层章节中,它学习了如何将 MVP 应用于 asp.net。演示者的代码是:

public class HomePagePresenter : IHomePagePresenter
{
   private IHomeView _view;
   private ProductService _productService;
   public HomePagePresenter(IHomeView view, ProductService productService)
   {
       _productService = productService;
       _view = view;
   }
   public void Display()
   {
        _view.TopSellingProduct = _productService.GetBestSellingProducts();
        _view.CategoryList = _productService.GetAllCategories();
   }
}

public interface IHomePagePresenter
{
    void Display();
}
Run Code Online (Sandbox Code Playgroud)

作者说:

我已经定义了这个(HomePagePresenter 的接口)来松散耦合代码并帮助测试。

我不明白他将如何使用演示者界面来创建测试?当我查看nmock 示例时,他们也没有为演示者创建任何界面。

toa*_*akz 3

使用接口公开 Presenter 的原因有很多:

  1. 多态性- 您可以有多种IHomePagePresenter实现,并且可以使用本地上下文依赖注入解析来确定在运行时使用哪一种。

  2. 测试期间的模拟- 您可能需要模拟这个特定的 Presenter 来进行单元测试,并且针对接口创建模拟比使用具体的类更容易。这确实也属于多态性,但它是一个具体的现实示例和松散耦合。“松散耦合”基本上是能够快速轻松地更换类的实现,而无需更改太多/任何代码。测试场景是您正在测试一个 Presenter 类,该类可能引用另一个 Presenter 接口 - 您将模拟另一个 Presenter 对象,而不是使用具体的类。

  3. 方法/属性访问限制- 接口限制您可以查看/使用实现的哪些部分,因此,例如,如果HomePagePresenter有许多该类的常规使用者不应该使用/有权访问的方法/属性,您可以限制它们的内容可以通过使用接口公开类来使用。