Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 如何为从同一抽象基类继承的不同具体类加载不同的ASP.NET控件_Design Patterns_Oop - Fatal编程技术网

Design patterns 如何为从同一抽象基类继承的不同具体类加载不同的ASP.NET控件

Design patterns 如何为从同一抽象基类继承的不同具体类加载不同的ASP.NET控件,design-patterns,oop,Design Patterns,Oop,假设您有一个抽象基类Task,这是一个用户可以完成的任务。有两个具体任务:SimpleTask和ChecklistTask。如果希望(ASP.NET)UI根据任务类型显示不同的控件,该怎么办 在WPF中可以使用数据模板,但在ASP.NET中使用数据模板的好方法是什么?顺便说一下,我们正试图避免使用switch语句。我们还有其他一些带有长switch语句的代码,它们起初很小,但随着时间的推移而增长。这就是我们试图避免的 有这样的设计模式吗?我们不能让任务类“知道”UI类,因为它们是域类。或者swi

假设您有一个抽象基类
Task
,这是一个用户可以完成的任务。有两个具体任务:
SimpleTask
ChecklistTask
。如果希望(ASP.NET)UI根据任务类型显示不同的控件,该怎么办


在WPF中可以使用数据模板,但在ASP.NET中使用数据模板的好方法是什么?顺便说一下,我们正试图避免使用switch语句。我们还有其他一些带有长switch语句的代码,它们起初很小,但随着时间的推移而增长。这就是我们试图避免的


有这样的设计模式吗?我们不能让
任务
类“知道”UI类,因为它们是域类。或者switch语句是我们能做的最好的语句(如果需要,隐藏在单独的“factory”类中)?

假设您的SimpleTask在SimpleTask.ascx中实现,而ChecklistTask在ChecklistTask.ascx中实现。然后将其放入.ascx所在的metainfo(以创建特定控件所需的任何方式)路径中(例如:“~/MyControls/SimpleTask.ascx”)


最后:embed control with TemplateControl.LoadControl我喜欢任何设计模式中的“隔离”部分,听着,我认为你应该为简单任务和检查表任务做两个UI实现,它们本身就是一个黑匣子,然后在另一个控件或页面上,如果要列出一些任务,您可以使用
ItemTemplate
,在此
ItemTemplate
中,您只需设置一个条件来检查任务的类型,并在其上调用此页面上的一个方法,以呈现正确类型的html(
Simple
Checklist

某处,必须知道如何将任务子类映射到UI控件。时期唯一的问题是把这些知识放在哪里

  • 任务本身
  • 一个类,可以使用从任务中检索的数据来查找适当的控件
  • 实际给出任务的代码(为什么不能改为给出UI控件?)
  • 一些代码可能通过属性和反射将任务类映射到UI控件
  • 其他类型的元数据

  • 这就是我们试图避免的:条件检查。因为如果你有20种任务会发生什么?但这似乎是不可避免的。然后最好将它放在一个单独的类中。任务不能“知道”UI控件,因为它是一个域类。除了将域耦合到UI之外,这甚至是不可能的。UI有一个对域程序集的引用,如果您希望域类提供UI控制,那么您就有循环依赖关系。这是一种可能性。总的来说,有些东西必须知道映射是什么-唯一的问题是,代码属于哪里,以及它是如何工作的?事实上,我可能会从编写一个可以进行映射的类开始,即使没有数据。。。找出如何作为一个单独的步骤和一个单独的类生成映射。是的,谢谢其他的可能性。事实上,需要做一些事情来映射。我只是想知道是否有一个干净的方法来做它,而不是通过一个大的if-else或switch语句。无论如何谢谢你!根据整个应用程序,我会考虑将自定义属性添加到UI控件中,该控件指定了映射到的任务类型。使用反射收集这些数据,填充字典,然后在获得实际任务时进行查找。仍然避免使用switch语句。这会将您的域与UI绑定一点,但更大的问题是,当您将控件移动到其他位置时,应用程序将不再工作。这是我们正在开发的一个相当大的应用程序,所以我相信这不是一个安全的、经得起未来考验的选择。