MVVM解决方案的一般结构
解决方案的结构一般是三个解决方案文件夹,分别是:
Models
ViewModels
Views
当然需要的话可以扩充,如Services、UnitTest等等。
然后每个解决方案文件夹里面包含各自的项目,项目里面的命名空间名自动跟随项目名,而不跟随解决方案文件夹名,而且用解决方案文件夹的好处就是解决方案不提供物理管理,只提供逻辑关联,所以在项目文件夹里是找不到解决方案文件夹的;解决方案文件夹可以右键直接编译,不同于普通的物理文件夹,普通的物理文件夹只能创建在项目下面,里面不可以再添加项目文件,而且不可以右键编译,这是他们两个的区别所在。
Models里包含的是数据以及数据是怎么来的,包括访问数据库,xml等等,这里面都是类库,不涉及任何UI的东东。
Views里面包含的是所有的UI,这里面都是界面,包括字体、Style、图片、动画、窗体、用户控件等,数据要怎么展示给用户,都在这里面,并且这里面只包含“纯UI”的代码,不涉及任何处理数据的代码。Views里面的每个工程的结构一般为:
Fonts
Images
Styles
UserControls
Windows
App.xaml
ViewModels里包含的是所有的逻辑,Models里的数据怎么组织、处理、调用、供给界面展示,都在这一层,如我之前所说,ViewModel其实意为“Model for View”,View里的UI全部、或者部分,直接、或者间接地把它的DataContext指向这里,所以这里的数据、方法、属性、命令、事件一般是为Views里的某个UI定制的,也可以是为某“一群”UI定制,这个看具体的需要,如果很多地方用到同一个逻辑,不妨抽象出一个公用的ViewModel,如a界面的ComBox要一个部门的列表作为数据源,b界面也有一个ComBox需要同样的部门列表,c界面也需要,那就把这个逻辑抽象出来公用。
为何要分出这么多项目,其实源自于CS程序的软肋。CS的东东,交付用户了,很开心,出Bug了,修改,然后重新发布到用户手里,重装,这是个很费事的过程,不像BS的,完全没有这困扰。把逻辑从UI的项目里抽出来,到最后就是一堆exe和dll,只要不涉及本质性的改动,哪个出问题了改哪个,到时候直接替换。
另外,每个项目的生成路径最后都指定到根目录下的Debug文件夹,方便打包和资源的归总。并且使用SVN的话,每个项目下的Debug文件夹是不用提交到服务器的,这个东东每次都会自动生成的。
MVVM解决方案的一般结构的更多相关文章
- [转]Vs解决方案的目录结构设置和管理
原文地址:[转]Vs解决方案的目录结构设置和管理 作者:大明 以下内容为“原创”+“转载” 首先,解决方案和项目文件夹包含关系(c++项目): VS解决方案和各个项目文件夹以及解决方案和各个项目对 ...
- Vs 2008 解决方案的目录结构设置和管理(转)
http://blog.csdn.net/lcj_cjfykx/article/details/8632459 MS的这个IDE,实在庞杂得恐怖.从大学开始,我就一直用VC的各个版本写程序至今,细细想 ...
- VC 2005 解决方案的目录结构设置和管理
VC 2005 解决方案的目录结构设置和管理 Roger (roger2yi@gmail.com) 一个中等规模的解决方案通常都会包含多个项目,其中一些项目产出静态库,一些产出动态库,一些用于 ...
- VS解决方案的目录结构设置和管理
一个中等规模的解决方案通常都会包含多个项目,其中一些项目产出静态库,一些产出动态库,一些用于单元测试,还有的产出最终的应用程序执行档.除此以外,根据项目的需求,还会使用一些第三方的库. 所以为解决 ...
- Visual Studio解决方案的目录结构设置和管理
摘至:http://blog.csdn.net/lp310018931/article/details/47991759 首先,解决方案和项目文件夹包含关系(c++项目): VS解决方案和各个项目文件 ...
- Visual C++ 设置适合自己的解决方案目录结构
Visual C++ 使用解决方案来管理项目,项目之间还可能有依赖关系,设置适合自己的解决方案目录结构,便于代码的管理.程序的发布. 下面开始一个虚拟解决方案设计: 假设此解决方案有应 ...
- 前端MVVM框架avalon揭秘 - 双向绑定原理
avalon大家可能不熟悉,但是Knockout估计或多或少听过用过,那么说说KO的几个概念 监控属性(Observables)和依赖跟踪(Dependency tracking) 声明式绑定(Dec ...
- c结构体初始化问题
结构体中的数组的初始化问题 我的代码 C/C++ code #include <stdio.h> #include <stdlib.h> struct a { int leng ...
- 听翁恺老师mooc笔记(11)--结构和函数
结构作为函数参数: 声明了一个结构就有了一种自定义的数据类型,这个数据类型和int.float.double一样,int等基本类型可以作为函数的参数,那么这种个自定义的结构类型也应该可以作为函数参数, ...
随机推荐
- javamail模拟邮箱功能发送电子邮件-基础实战篇(javamail API电子邮件实例)
引言: JavaMail 是一种可选的.能用于读取.编写和发送电子消息的包 JavaMail jar包下载地址:http://java.sun.com/products/javamail/downlo ...
- JVM——新生代与老年代
首先看在JVM的堆中,按代的划分: Young:主要是用来存放新生的对象. Old:主要存放应用程序中生命周期长的内存对象. Permanent:是指内存的永久保存区域,主要存放Class和Meta的 ...
- RAC 环境下修改归档模式
RAC环境下的归档模式切换与单实例稍有不同,主要是共享存储所产生的差异.在这种情况下,我们可以将RAC数据库切换到非集群状态下,仅仅在一个实例上来实施归档模式切换即可完成RAC数据库的归档模式转换问题 ...
- Arduino报错
avrdude: stk500_recv(): programmer is not respondingavrdude: stk500_getsync() attempt 1 of 10: not i ...
- 使用Jquery Mobile设计Android通讯录
本系列教程将指导大家一步步使用Jquery Mobile设计一个Android的通讯录应用.其中在应用的界面部分,将使用jQuery Mobile框架,并且会指导大家如何使Android中提供的web ...
- LR之录制SQL脚本
1.选择协议 ①MS SQL serve ②ODBC 一般情况下选ODBC 2.录制步骤
- 整理string类常见方法的使用说明
整理String类的Length().charAt().getChars().replace().toUpperCase().toLowerCase().trim().toCharArray()使用说 ...
- AI线性图标教程-转起
- javascript中=、==、===区别详解
javascript中=.==.===区别详解今天在项目开发过中发现在一个小问题.在判断n==""结果当n=0时 n==""结果也返回了true.虽然是个小问题 ...
- [WebService]之JWS_1
创建JWS项目步骤: 1:创建接口 2:创建实现类 3:开启服务 1:编写接口 @WebService public interface IMyService { public int add(int ...