有什么可以反对使所有域对象都继承自INotifyPropertyChanged吗?

时间:2014-07-10 08:04:13

标签: c# mvvm architecture inotifypropertychanged domain-object

我正在重构和重新设计我的应用程序的域对象,它在某种程度上使用MVVM。是否存在任何反对使所有域对象(POCOs)继承自INotifyPropertyChanged的内容,因此任何人都可以按照自己的意愿观察对象。

结合https://stackoverflow.com/a/1316566/448357,这甚至不必非常难看。

另一方面,polluting my domain object有什么可能根本不需要的东西,因为无论如何都会有一个单独的View-Model? Margabit指出: UI模型!=域模型

3 个答案:

答案 0 :(得分:1)

IMO,域对象不应实现INotifyPropertyChanged。应该实现它的是 ViewModel

原因是:

  1. 您可能最需要在视图模型中举起PropertyChanged事件来保存您的POCO
  2. 你只会实现一次。
  3. 如果您的POCO想要举办活动并通知其中发生了某些事件,我不确定PropertyChanged是否是最有意义的事件。

答案 1 :(得分:1)

我认为这取决于项目的范围:如果这是一个小项目,其中Domainmodels也被用作UI-mmodels,如果你愿意的话,一定要这样做。

但是如果你经常需要UI模型,例如因为有很多属性/方法不属于您的域模型,所以不要打扰 - 您只需很少或没有理由创建开销。

什么时候需要UI模型?我的经验法则:如果要引入具有[NotMapped](实体框架)属性的属性,请继续使用此属性创建UI模型。

如果这个项目的某些部分有可能在另一个环境中使用(Webapp,手机等等),我建议反对它 - 无论如何你都需要UI模型。

答案 2 :(得分:0)

为避免在类中插入代码,您可以创建透明代理。 你可以使用Castle http://www.castleproject.org/dynamicproxy/index.html

唯一的限制是您必须通过工厂创建类的实例。

您也可以使用System.Runtime.Remoting.Proxies.RealProxy类,但您的基类必须派生自MarshalByRef(仍然是POCO?:)。

http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=IT-IT&k=k(SYSTEM.RUNTIME.REMOTING.PROXIES.REALPROXY)%3bk(TargetFrameworkMoniker-%22.NETFRAMEWORK%2cVERSION%3dV4.0%22)%3bk(DevLang-CSHARP)&rd=true