我发现很难理解如何最好地实现不是简单类型的“IView”接口属性,并且想知道其他人如何在 Model View Presenter 应用程序中处理这个问题。
我读过的文章非常好,但它们似乎都没有接近更复杂的视图,其中您具有 List<> 属性,这些属性是表示域模型中的类的接口类型,即 IPerson 或 IName 等。
我将尽可能简要地概述一个场景。
假设我需要 View 最终保留一个名称列表,每个名称由 3 个属性“Forename”、“Surname”和“Title”组成。
通常,我将有一个域模型,其中包含一个名为“Name”的类,具有 3 个属性。此域模型将实现一个名为“IName”的接口(在单独的“接口”类库中)。
现在在我的“Interaces”库中的“Views”命名空间中,我有一个名为“IViewNames”的接口。这是任何想要最终保留名称列表的视图都将实现的视图接口。
如何定义这个“IViewNames”界面让我很困惑。如果我给它一个这样的属性:
public List<IName> Names {get;set;}
那么我实现的具体视图最终将有一个复杂的属性'Names',它将需要一个'getter',它遍历视图上的字段,以某种方式实例化'IName'的一个实例,设置它的属性,添加到一个列表中,然后返回名单。'setter' 将同样复杂,接收 'INames' 列表并在视图中设置字段并遍历它们。
我觉得这打破了 MVP 方法的主要目标之一,即无需任何具体的视图实现就能够彻底测试应用程序代码。毕竟,我可以很容易地编写一个演示者来查看“View.Names”属性并将其发送到服务层,或者在从服务接收到“名称”对象列表时设置“View.Names”属性层。我可以轻松编写很多测试来确保一切正常,除了视图中的 COMPLEX 属性之外的所有内容。
所以我的问题是,其他人如何处理不是简单类型但实际上是您的域模型类型的 IView 属性?(代表您的域模型的接口类型很好,因为我显然不希望从我的表示层引用到我的域模型层)。
我非常确定有一种已知的技术可以以一种优雅的方式实现这一点,它比我的示例方法更符合模型视图演示器的目标。
提前感谢任何帮助的人。