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等基本类型可以作为函数的参数,那么这种个自定义的结构类型也应该可以作为函数参数, ...
随机推荐
- marginCollapse之兄弟关系的DIV
废话不说,直接上图 基本代码如下: 效果图如下: 给两个div分别加marginBottom和marginTop看一下效果 实际效果如下: 我们可以看出两个div之间的距离并不是50+50,而是只显示 ...
- 定时组件quartz系列<一>模拟定时组件小程序
一.核心概念 Quartz的原理不是很复杂,只要搞明白几个概念,然后知道如何去启动和关闭一个调度程序即可. 1.Job表示一个工作,要执行的具体内容.此接口中只有一个方法void execute(Jo ...
- 一天一点MySQL复习——存储过程
一.存储过程概念 使用SQL编写访问数据库的代码时,可用两种方法存储和执行这些代码,一种是在客户端存储代码,并创建向数据库服务器发送的SQL命令(或SQL语句),比如在C#.Java等客户端编程语言中 ...
- 安卓 Dialogs(对话框)
转载自:http://www.apkbus.com/home.php?mod=space&uid=679028&do=blog&id=61197 对话框是一个小的窗口用以提示用 ...
- Amarino例程无法使用的问题
Serial.begin(9600); 而不是用它的57600
- PHP遍历数组
foreach PHP代码: <?php $url = array( '新浪' =>'www.sina.com' , '雅虎' =>'www ...
- 自动抓取java堆栈
参数1 进程名字,参数2 最大线程数 例: pid为8888,达到1000个线程时自动抓取堆栈信息 ./autojstack.sh 8888 1000 & #!/bin/bashfileNam ...
- JavaScript 性能优化 --By Google V8 Team Manager
原文:https://developers.google.com/v8/?hl=zh-CN Be Prepared before writing code[9:35] Understand how V ...
- 【LeetCode】189 - Rotate Array
Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the array ...
- 【C#】Abstract和Virtual的区别
一.Virtual方法(虚方法) virtual 关键字用于在基类中修饰方法.virtual的使用会有两种情况: 情况1:在基类中定义了virtual方法,但在派生类中没有重写该虚方法.那么在对派生类 ...