我们有遗留代码,其中包含具有超过一百个属性的业务对象和层次结构中的几个层。 我们的目标是将其转换为将使用WCF调用的C#服务器应用程序。然而,WPF属性系统似乎是一个很好的工具,因为它更有效,还有一些其他的奖励功能,如属性继承,这对我们的库很有用。
但是,我不知道在非WPF应用程序中使用它是否可行。有人可以告诉它是否可行,以及是否有在非WPF应用程序中使用的示例项目?
答案 0 :(得分:1)
WPF主要基于DependencyProperties,但DependencyProperties不是WPF特有的功能,您可以自己轻松使用它。
关于INotifyPropertyChanged接口你可以这么说 - 它可以在WPF之外实现和使用。
答案 1 :(得分:1)
DependencyProperties支持来自DependencyObject类,它位于WindowsBase.dll中
如果添加该引用没有问题,在服务器端解决方案中使用它绝对没有问题。
但请注意,这意味着您必须从DependencyObject继承您的类,这可能会导致问题 - C#不支持多继承。
实现INotifyPropertyChanged虽然更简单,更轻松 - 除了变更通知之外不会给你任何其他东西。 DependecyProperties的功能集更大(就像你提到的那样)。此外,如果您使用Binding,DependencyProperties的工作速度会更快,因为它不使用反射(而INPC会这样做)
我不知道任何尝试过您的方法的服务器端解决方案,但如果您确实需要DP公开的功能,我真的不明白为什么不这样做。
---编辑---
DependecyObject继承DispatcherObject,它只能从创建它的线程访问它,因此多线程处理这些对象将成为PAIN。如果你需要多线程,那么这是一个很大的禁忌。
答案 2 :(得分:1)
可行否?是。实际的?可能不是。
作为服务器应用程序,您几乎肯定希望从任何线程访问您的业务对象。但是依赖项对象具有线程亲和性,必须通过它们的Dispatcher在创建它们的线程上访问它们。如果你使用调度员,这意味着你需要抽出一些事情。
这假设您的业务对象具有通常采用默认值的属性。如果您没有“常见默认值”,稀疏存储算法将无法帮助您节省内存。稀疏存储系统在WPF中运行良好的原因是因为控件具有很多属性,其中许多属性总是具有相同的值。
基本上,你可能会遇到很多痛苦,甚至可能不会减少内存使用量。在我看来,你最好以其他方式处理你的问题,或者实现你自己的自由线程稀疏存储机制,如果你确认它实际上会减少内存使用。
答案 3 :(得分:0)
是否需要花费大量工作来模拟依赖属性的使用?
不需要支持XAML,它应该很容易。
但是,我发现创建默认索引器并使用字符串作为索引更容易。
您只需记住在任何已解析的文件中包含[]。
这肯定是一个更便宜的动态物业系统。