使用Prism重构项目中的问题汇总
1.把Page拆分成若干小的View到Module中,这时候,对于View中的图片,要设置为Do not copy和Resource,同时,要使用相对路径,就是说,原来是:
<Image Source="Images/Garage.jpg" ...
要改为:
<Image Source="../Images/Garage.jpg" ...(这里,假设Images是根目录下的一个文件夹。)
——没办法,儿子变孙子了。和UserControl有关,至于再嵌套一层Region和View,图片路径是否还要变,我不知道。于是,冒着项目重构被delay的危险,我偷偷做了一个实验,发现。。。
2.nnd,想起来我就要骂人。官大一级压死人,不分青红皂白,非要我把写好的PresentationModel模式通通改为ViewModel模式。老实说,我对工作量多少是不care的,只要保证技术正确;我只是对VM一直有成见。在转换的过程中发现,我所做的工作就是把PresentationModel模式的Presenter和Model合二为一,同时,由于只能在View中引用ViewModel,所以,只能使用View-first的技术。
更加不喜欢ViewModel模式,因为它把Logic和Entity混在一起。这就导致了一个问题,那就是Model重用——哪怕Model是一样的,因为Logic不一样,所以ViewModel做不到重用。没办法,只好一个View对应一个ViewModel。土了吧,Asset一把,ViewModel只能用于小型项目,而PresentationModel模式用于大型项目。
园子里也做这一行技术的朋友,看到后千万引以为戒,不要人云亦云,看到大多数公司都使用VM就跟风。请把握两种模式的不同使用场合。反正我这个项目是完蛋了,呵呵,我这里提前总结教训。
3.关于Silverlight尤其是Prism下的UT。
这是个很麻烦的事情,因为不能右击选择“Create UT”菜单,只能手动编写每个方法。于是工作量剧增,写一个UT方法的时间经常是写原方法所花费时间的好几倍。
详细技术请参见http://weblogs.asp.net/scottgu/archive/2008/04/02/unit-testing-with-silverlight.aspx,具体Demo请参加Prism自带的QuickStart和RI。
4.做一个RegionNames类,放置所有的Region名称,以加速开发速度:
5.既然实现了INotifyPropertyChanged,在设置属性的时候,就要使用属性而不是字段(大写而不是小写),否则绑定不会被fired。
<Image Source="Images/Garage.jpg" ...
要改为:
<Image Source="../Images/Garage.jpg" ...(这里,假设Images是根目录下的一个文件夹。)
——没办法,儿子变孙子了。和UserControl有关,至于再嵌套一层Region和View,图片路径是否还要变,我不知道。于是,冒着项目重构被delay的危险,我偷偷做了一个实验,发现。。。
2.nnd,想起来我就要骂人。官大一级压死人,不分青红皂白,非要我把写好的PresentationModel模式通通改为ViewModel模式。老实说,我对工作量多少是不care的,只要保证技术正确;我只是对VM一直有成见。在转换的过程中发现,我所做的工作就是把PresentationModel模式的Presenter和Model合二为一,同时,由于只能在View中引用ViewModel,所以,只能使用View-first的技术。
更加不喜欢ViewModel模式,因为它把Logic和Entity混在一起。这就导致了一个问题,那就是Model重用——哪怕Model是一样的,因为Logic不一样,所以ViewModel做不到重用。没办法,只好一个View对应一个ViewModel。土了吧,Asset一把,ViewModel只能用于小型项目,而PresentationModel模式用于大型项目。
园子里也做这一行技术的朋友,看到后千万引以为戒,不要人云亦云,看到大多数公司都使用VM就跟风。请把握两种模式的不同使用场合。反正我这个项目是完蛋了,呵呵,我这里提前总结教训。
3.关于Silverlight尤其是Prism下的UT。
这是个很麻烦的事情,因为不能右击选择“Create UT”菜单,只能手动编写每个方法。于是工作量剧增,写一个UT方法的时间经常是写原方法所花费时间的好几倍。
详细技术请参见http://weblogs.asp.net/scottgu/archive/2008/04/02/unit-testing-with-silverlight.aspx,具体Demo请参加Prism自带的QuickStart和RI。
4.做一个RegionNames类,放置所有的Region名称,以加速开发速度:
public class RegionNames
{
public const string HeaderRegion = "HeaderRegion";
public const string ContentRegion = "ContentRegion";
public const string AssetRegion = "AssetRegion";
public const string WeatherNewsRegion = "WeatherNewsRegion";
public const string WeatherQueryRegion = "WeatherQueryRegion";
public const string FlightPanelRegion = "FlightPanelRegion";
public const string AlertRegion = "AlertRegion";
}
{
public const string HeaderRegion = "HeaderRegion";
public const string ContentRegion = "ContentRegion";
public const string AssetRegion = "AssetRegion";
public const string WeatherNewsRegion = "WeatherNewsRegion";
public const string WeatherQueryRegion = "WeatherQueryRegion";
public const string FlightPanelRegion = "FlightPanelRegion";
public const string AlertRegion = "AlertRegion";
}
5.既然实现了INotifyPropertyChanged,在设置属性的时候,就要使用属性而不是字段(大写而不是小写),否则绑定不会被fired。
6.TextBlock上的单击事件已经解决。DataGrid中的TextBlock上的单击事件已经解决——这不是一句两句就能说清楚的,另起炉灶。
7.三种打开新窗口的方式:弹出新的带有SL的IE,弹出像MessageBox模式的对话框,在当前界面的某个区域,remove掉原有的,添加上新的。
8.MV-VM模式,由于没有Presenter,ViewModel不能反向操作View,于是在View中有一个ViewModel类型的Model属性外,还要在ViewModel中有一个IView的View属性,在初始化的时候绑定。
9.大部分event是可以屏蔽掉,要么绑定到ViewModel的属性,要么做成Command。但是,有一些事件还真不好处理,还是摆在那里吧,我隐隐的感觉到MVVM包括MVP模式的一些作茧自缚。
10.ActiveView和View的区别到底是什么?反正我现在是把之前的View都清了,然后再加新的View。貌似ActiveView的数量有时为0,而View的数量不为0。
11.有了Prism的Region,就不再需要Navigation了。
12.基于SOA架构的项目,各层应该有自己的实体,而不是说为了省事,DUI层直接使用Business层的实体。这是检查一个程序员是否合格的标准。
13.AgMenu真的不能实现Command吗?
14.既然可以View和ViewModel互相引用,那么就可以view-last。而不使用Loaded事件。
15.单独的XAML不同于pic,要设置为embeded Resource
16.花了半小时,调试var views = region.Views.ToList();为什么ToList方法找不到,原来没引用System.Linq;靠,脑袋有点昏。