我正在重构和重新设计在某种程度上使用MVVM的应用程序的域对象。是否有任何反对让所有域对象(POCO)继承自INotifyPropertyChanged的东西,所以任何人都可以按照自己的意愿观察对象。
结合https://stackoverflow.com/a/1316566/448357这甚至不必非常难看。
另一方面,用可能根本不需要的东西污染我的域对象怎么办,因为无论如何都会有一个单独的视图模型?Margabit 指出:UI 模型!= 领域模型
我正在重构和重新设计在某种程度上使用MVVM的应用程序的域对象。是否有任何反对让所有域对象(POCO)继承自INotifyPropertyChanged的东西,所以任何人都可以按照自己的意愿观察对象。
结合https://stackoverflow.com/a/1316566/448357这甚至不必非常难看。
另一方面,用可能根本不需要的东西污染我的域对象怎么办,因为无论如何都会有一个单独的视图模型?Margabit 指出:UI 模型!= 领域模型
IMO,域对象不应该实现INotifyPropertyChanged
. 应该实施它的是您的ViewModel。
原因是:
PropertyChanged
包含 POCO 的视图模型中引发一个事件PropertyChanged
是否会引发最有意义的事件。我认为这在一定程度上取决于项目的范围:如果这是一个小型项目,其中 Domainmodels 也用作 UI-mmodels,如果您愿意,请务必这样做。
但是,如果您经常需要 UI 模型,例如因为有很多属性/方法不属于您的域模型,请不要打扰 - 您几乎没有或没有理由创建开销。
什么时候需要 UI 模型?我的经验法则:如果您要引入具有 [NotMapped](实体框架)属性的属性,请继续使用此属性制作 UI 模型。
此外,如果该项目的某些部分有可能在另一个上下文中使用(Webapp、电话等 pp),我建议不要这样做——无论如何你都需要 UI 模型。
为避免在您的类中插入代码,您可以创建一个透明代理。您可以使用城堡 http://www.castleproject.org/dynamicproxy/index.html
唯一的限制是您必须通过工厂创建类的实例。
您也可以使用 System.Runtime.Remoting.Proxies.RealProxy 类,但您的基类必须从 MarshalByRef 派生(仍然是 POCO?:))。