首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#如何观察深度嵌套的层次对象?

C#如何观察深度嵌套的层次对象?
EN

Stack Overflow用户
提问于 2019-11-28 21:08:55
回答 1查看 663关注 0票数 0

我正在编写一个C# mvvm应用程序,其中我在UI层上有一个大的域模型,其中包含嵌套的分层对象。大域模型对象有许多嵌套对象,它们都实现了INotifyPropertyChanged。现在可以假设大模型是一个作业,而作业在其生命周期中会被填充数据,直到它被发送出去。作业在其生存期内被操作,它是一个活动的实体对象,而不是简单的值对象(struct)。

根对象本身也可以通过INotifyPropertyChanged观察到,这导致了两个问题:

  1. 观察嵌套在第3级上的对象意味着观察者/侦听器必须通过递归地添加事件侦听器来跟踪整个大模型,直到->的可维护性降低为止,因为每个观察者都需要知道整个大模型的根。对大模型的更改会导致应用程序的许多不同部分的更改。
  2. 有些侦听器实际上对对象的不同级别感兴趣,例如,特定侦听器可能希望从第2级和第4级进行更新。

到目前为止的想法:

  1. 公开一个工厂(模式),它知道大对象并创建ObserverObject : IDisposable,以便获取侦听器。这样,侦听器只具有ObserverObject并得到有关值更改的通知,而工厂执行簿记以解决当更高级别设置为新值时的嵌套和失效问题。通过这种方式,我只能在一个点而不是很多点上感到内部组件的头痛,并且提供了更好的可维护性。
  2. 每个字段和嵌套对象及其字段.大模型以Uri的形式获得唯一的入口。侦听器知道Uri,并请求存储库接收给定Uri的ObserverObject。这种方法扩展了第一种选择,因为它允许在不同的嵌套级别上有相同类型的对象,这是我经常使用的。

我不太清楚哪一种方法更好,但我倾向于第二种选择。在我的用例中,我将有不同的侦听器,它们可能对大模型的不同级别感兴趣,而且集合中还有一些动态对象(项可以频繁地添加和删除,侦听器需要对此做出反应,例如更新ViewModels中的列表)。

EN

回答 1

Stack Overflow用户

发布于 2019-11-28 21:15:50

C#如何观察深度嵌套的动态对象?

理想情况下,您不应该使用动态类型或真正在运行时创建的类型。禁用编译时类型安全性较差。但动态可以直接“感染”其他类型。如果在部分计算中使用动态,则函数的返回值也会变为动态的。但我认为你彻底考虑了所有其他选择。

如果您必须继续使用动态类型,请考虑使用ExpandoObject。它似乎直接适合这份工作。实际上,它不过是一个带有一些语法糖的Dictionary<string, object> --最重要的是,根据所有“键”/“属性”上的INotifyPropertyChanged更改通知。

我不太明白深巢和这有什么关系。任何集合都需要3种类型的更改通知:

  • 在集合项的每个属性(ExpandObject或某些具体类型)上。
  • 每个元素的添加和删除。这就是ObservableCollection负责的
  • 在公开列表的属性上。由于OC不是一个大容量的修改,所以在将其公开给GUI和绑定之前,通常需要在代码后面准备一个新列表。

只要每个人都遵守这些规则,你就可以下一个你想要的深度。

如果您担心这方面的性能:

  1. 阅读速度咆哮,跳过第1部分。
  2. 您正在撤回太多的数据,用户无论如何都无法处理。我的经验法则是永远不要超过100个字段/值抛出给用户。理想情况下,比那更少。总是在查询中进行同样多的过滤、排序等操作。不要检索更多的数据,这样用户就可以处理。虽然MVVM在GUI附近有所有那些很好的过滤器和排序选项,但是您应该尽量避免它们。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59096164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档