C# 对于MVP设计中的视图界面,IView成员应该有多抽象?

C# 对于MVP设计中的视图界面,IView成员应该有多抽象?,c#,.net,asp.net,design-patterns,C#,.net,Asp.net,Design Patterns,我还在学习MVP。我有一个IView和一个演示者。我有一个为这个应用程序编写的自定义列表控件。我想添加一些项目,一次一个。我应该公开IView.AddItem(项)还是应该公开IView.MyCustomList属性 这是一个风格问题,还是有一个正确的答案 是的,这完全是一个风格问题,以及你觉得更适合的东西。是的,这完全是一个风格问题,以及你觉得更适合的东西。通过不公开你的自定义列表,你可以更好地控制一个项目应该如何添加到你的自定义列表中。 公开AddItem方法将更有效地保护列表,防止可能的滥

我还在学习MVP。我有一个IView和一个演示者。我有一个为这个应用程序编写的自定义列表控件。我想添加一些项目,一次一个。我应该公开IView.AddItem(项)还是应该公开IView.MyCustomList属性


这是一个风格问题,还是有一个正确的答案

是的,这完全是一个风格问题,以及你觉得更适合的东西。

是的,这完全是一个风格问题,以及你觉得更适合的东西。

通过不公开你的自定义列表,你可以更好地控制一个项目应该如何添加到你的自定义列表中。 公开AddItem方法将更有效地保护列表,防止可能的滥用


您可以选择,这取决于您对列表的控制程度。

通过不公开自定义列表,您可以更好地控制项目应如何添加到自定义列表中。 公开AddItem方法将更有效地保护列表,防止可能的滥用


你可以选择,这取决于你想对列表保持多大的控制。

我个人认为好的风格将保持MVP模式的目的和代码的整洁

如果我理解正确,您的
CustomList
属性将具有自定义控件的类型。通过视图接口公开此类属性将导致使用该接口(演示者)的所有代码依赖于您的控件(并将其引用为依赖项)。这是可能的,并且可能会很好地满足您的需求,但这与MVP设计模式背道而驰。您可能希望将视图实现和演示者分离到不同的程序集中。但两者都必须引用您的控件。MVP的设计目的是分离特定于用户界面的交互和特定的控制功能(在大多数情况下依赖于框架/供应商),并将它们隐藏在业务逻辑(演示者)之外

在您的场景中,我建议向演示者公开
AddItem
方法-视图实现负责处理用户控件或与显示数据相关的任何事项。另一方面,演示者将专注于检索数据和执行一些业务逻辑

我怀疑您不必同时支持不同的用户界面技术(如ASP.NET Web窗体、WPF/Silverligth或ASP.NET MVC),但如果您假设必须将ASP.NET MVC网站移植到destktop WPF应用程序,并坚持MVP设计模式,那么您会(在最佳情况下)必须在每个UI技术中只实现视图界面,为演示者、服务和所有业务逻辑内容保持相同的代码库(实际上,从ASP.NET MVC到桌面将是一个相当冒险的过程,但示例应强调演示者和业务逻辑不必修改)



一些Java框架具有表示UI组件的抽象接口(UI模型),可以跨不同的UI技术重用。在这种情况下,通过UI模型接口(它必须实现)公开UI组件是可以接受的。

我个人认为好的风格将保持MVP模式的用途和代码的整洁

如果我理解正确,您的
CustomList
属性将具有自定义控件的类型。通过视图接口公开此类属性将导致使用该接口(演示者)的所有代码依赖于您的控件(并将其引用为依赖项)。这是可能的,并且可能会很好地满足您的需求,但这与MVP设计模式背道而驰。您可能希望将视图实现和演示者分离到不同的程序集中。但两者都必须引用您的控件。MVP的设计目的是分离特定于用户界面的交互和特定的控制功能(在大多数情况下依赖于框架/供应商),并将它们隐藏在业务逻辑(演示者)之外

在您的场景中,我建议向演示者公开
AddItem
方法-视图实现负责处理用户控件或与显示数据相关的任何事项。另一方面,演示者将专注于检索数据和执行一些业务逻辑

我怀疑您不必同时支持不同的用户界面技术(如ASP.NET Web窗体、WPF/Silverligth或ASP.NET MVC),但如果您假设必须将ASP.NET MVC网站移植到destktop WPF应用程序,并坚持MVP设计模式,那么您会(在最佳情况下)必须在每个UI技术中只实现视图界面,为演示者、服务和所有业务逻辑内容保持相同的代码库(实际上,从ASP.NET MVC到桌面将是一个相当冒险的过程,但示例应强调演示者和业务逻辑不必修改)


一些Java框架具有表示UI组件的抽象接口(UI模型),可以跨不同的UI技术重用。在这种情况下,通过UI模型接口(必须实现)公开UI组件是可以接受的