Prism与MVVM并不是谁替代谁的关系,它们本来就是组合在一起用的(prism 版本4)。prism的目的是构建wpf/silverlight composite app(组合程序)。把一个程序分解成一个个独立的模块(Module),各个模块可以独立开发,独立测试。然后动态组装。就像一部汽车的各个零部件可以委托给其他不同厂商制造后拿过来组装一样。Modularity(模块化)是prism的核心。
MVVM的核心是View的抽象。 也就是本来应用程序可以看作有两个部分:一个是数据(Model),另一个是展现这个数据的视图(View),那么MVVM(Model-View-ViewModel)在数据和视图之外又多个东西:ViewModel. 以我个人的感受是对待这个ViewModel要经常提醒自己它是视图的抽象。刚学MVVM时总是能看到很多示例是VM提供ObservableCollection<T>,ICommand供视图绑定,这样很容易忘记VM本质是视图的抽象这么一个感觉,向View提供数据,提供Command绑定是重要,但视图的抽象才是本质和目的。
Prism的缺点我个人觉得就是你可能真的要花些时间才能好好应用。这可能因人而异吧,基础好的可能快些。
有一点可能也是因人而异,学习Prism碰到的第一个障碍可能就是DI(Dependency Injection),就是依赖注入。Prism应用了大量的依赖注入。默认提供了二种DI Container: Unity和MEF. 就这种DI Container本身也是不小的学习量。就比如MEF,当你对MEF有了比较全面的了解后,比如对Recomposition, DeploymentCatalog等有了解后,对Prism的一些运作方式的理解会有帮助。
再有可能碰到的困难就是怎样与时下流行的Silverlight + WCF RIA Services + Entity Framework的开发方式结合的问题。这种方式下怎样应用MVVM是个问题,再进一步怎样与Prism结合也是个问题。这方面我个人的一个感觉是RIA Services返回给客户端的EntitySet<T>实际上已经实现了INotifyCollectionChanged,INotifyPropertyChanged等接口,所以DomainContext在MVVM模式下起着很重要的作用,大多数情况下不必再使用ObservableCollection.