- 最关键的,UI层只能做为一个外壳,不能包含任何业务逻辑(BizLogic)的处理过程。只有少许(或者没有)SQL语句或者存储过程的调用,而且这些语句保证不会修改数据。
- 设计时应该从BLL出发,而不是UI出发。BLL层在API上应该实现全部BizLogic(以面向对象的方式)。若是把UILayer拿掉,项目还能在Interface/API的层次上提供全部功能)。
- 无论数据层是一个简单的SqlHelper也好,仍是带有Mapping过的Classes也好,应该在必定的抽象程度上作到系统无关(DAL能够移植到其余相似环境的项目)。
- 无论使用COM+(Enterprise Service),仍是Remoting,仍是WebService之类的远程对象技术,无论部署的时候是否是真的分别部署到不一样的服务器上,最起码在设计的时候要作这样的考虑,更远的,还得考虑多台服务器经过负载均衡做集群(三个模块,能够分别运行于不一样的服务器)。
1,结构清晰、耦合度低,html
2,可维护性高,可扩展性高;程序员
3,利于开发任务同步进行;容易适应需求变化数据库
一、有时会致使级联的修改。这种修改尤为体如今自上而下的方向。若是在表示层中须要增长一个功能,为保证其设计符合分层式结构,可能须要在相应的业务逻辑层和数据访问层中都增长相应的代码编程
二、增长了代码量,增长了工做量,增长了复杂度。服务器
MVC则是表现层的框架模式。用于解除业务逻辑和视图之间的耦合。从而易于扩展,便于测试。架构
在MVC中Model应该包含2部分功能,一部分是处理业务逻辑,一部分是提供View显示的数据。app
控制器变得依赖信息数据中心或数据库,对象将间接地经过控制器的action耦合在一块儿负载均衡
MVC最先的定义毕竟是79年提出的,到如今GUI编程环境,业务复杂程度都有了很大改变。当采用MVC模式设计UI应用时,通常会根据开发框架的特色来对Model,View和Contoller设置一个明确的界限,同时为它们之间的交互制定一个更加严格的规则。
public
class
Employee
{
public
string
Id {
get
;
private
set
; }
public
string
Name {
get
;
private
set
; }
public
string
Gender {
get
;
private
set
; }
public
DateTime BirthDate {
get
;
private
set
; }
public
string
Department {
get
;
private
set
; }
public
Employee(
string
id,
string
name,
string
gender,DateTime birthDate,
string
department)
{
Id = id;
Name = name;
Gender = gender;
BirthDate = birthDate;
Department = department;
}
}
public
class
EmployeeRespository
{
private
static
IList<Employee> employees;
static
EmployeeRespository()
{
employees =
new
List<Employee>()
{
new
Employee(
"001"
,
"张三"
,
"男"
,
new
DateTime(1981,8,24),
"销售部"
),
new
Employee(
"002"
,
"李四"
,
"男"
,
new
DateTime(1981,8,24),
"人事部"
),
new
Employee(
"003"
,
"王五"
,
"女"
,
new
DateTime(1981,8,24),
"人事部"
)
};
}
public
IEnumerable<Employee> GetEmployees(
string
department =
""
)
{
if
(
string
.IsNullOrEmpty(department))
{
return
employees;
}
return
employees.Where(e => e.Department == department).ToArray();
}
}
public
class
EmployeePresenter
{
public
IEmployeeView View {
get
;
private
set
; }
public
EmployeeRespository Respository {
get
;
private
set
; }
public
EmployeePresenter(IEmployeeView view)
{
this
.View = view;
this
.Respository =
new
EmployeeRespository();
this
.View.DepartmentSelected += OnDepartmentSelected;
}
public
void
Initialize()
{
IEnumerable<Employee> employees =
this
.Respository.GetEmployees();
this
.View.BindEmployees(employees);
string
[] departments
=
new
string
[]{
""
,
"销售部"
,
"采购部"
,
"人事部"
};
this
.View.BindDepartments(departments);
}
protected
void
OnDepartmentSelected(
object
sender, DepartmentSelectedEventArgs args)
{
string
department = args.Department;
var
employees =
this
.Respository.GetEmployees(department);
this
.View.BindEmployees(employees);
}
}
public
interface
IEmployeeView
{
void
BindEmployees(IEnumerable<Employee> employees);
void
BindDepartments(IEnumerable<
string
> departments);
event
EventHandler<DepartmentSelectedEventArgs> DepartmentSelected;
}
public
class
DepartmentSelectedEventArgs : EventArgs
{
public
string
Department {
get
;
private
set
; }
public
DepartmentSelectedEventArgs(
string
department)
{
this
.Department = department;
}
}
public
partial
class
Form1 : Form, IEmployeeView
{
private
EmployeePresenter Presenter{
get
;
private
set
; }
public
Form1()
{
InitializeComponent();
Presenter =
new
EmployeePresenter(
this
);
Presenter.Initialize();
}
public
event
EventHandler<DepartmentSelectedEventArgs> DepartmentSelected;
public
void
BindDepartments(IEnumerable<
string
> departments)
{
this
.comboBox1.DataSource = departments;
}
public
void
BindEmployees(IEnumerable<Employee> employees)
{
this
.listBox1.DataSource = employees;
this
.listBox1.DisplayMember =
"Name"
;
}
private
void
comboBox1_SelectedIndexChanged(
object
sender, EventArgs e)
{
string
department = (
string
)
this
.comboBox1.SelectedItem;
DepartmentSelectedEventArgs eventArgs =
new
DepartmentSelectedEventArgs(department);
DepartmentSelected?.Invoke(sender, eventArgs);
}
}
WebForm实现的UI界面
public
partial
class
Default : Page, IEmployeeView
{
public
EmployeePresenter Presenter {
get
;
private
set
; }
public
event
EventHandler<DepartmentSelectedEventArgs> DepartmentSelected;
public
Default()
{
this
.Presenter =
new
EmployeePresenter(
this
);
}
protected
void
Page_Load(
object
sender, EventArgs e)
{
if
(!
this
.IsPostBack)
{
this
.Presenter.Initialize();
}
}
protected
void
ButtonSearch_Click(
object
sender, EventArgs e)
{
string
department =
this
.DropDownListDepartments.SelectedValue;
DepartmentSelectedEventArgs eventArgs =
new
DepartmentSelectedEventArgs(department);
if
(
null
!= DepartmentSelected)
{
DepartmentSelected(
this
, eventArgs);
}
}
public
void
BindEmployees(IEnumerable<Employee> employees)
{
this
.GridViewEmployees.DataSource = employees;
this
.GridViewEmployees.DataBind();
}
public
void
BindDepartments(IEnumerable<
string
> departments)
{
this
.DropDownListDepartments.DataSource = departments;
this
.DropDownListDepartments.DataBind();
}
}
在MVP里,能够根据User Story来首先设计和开发Presenter。在这个过程当中,View是很简单的,可以把信息显示清楚就能够了。在后面,根据须要再随便更改View, 而对Presenter没有任何的影响了。框架
若是要实现的UI比较复杂,并且相关的显示逻辑还跟Model有关系,能够在View和 Presenter之间放置一个Adapter。由这个 Adapter来访问Model和View,避免二者之间的关联。而同时,由于Adapter实现了View的接口,从而能够保证与Presenter之 间接口的不变。这样就能够保证View和Presenter之间接口的简洁,又不失去UI的灵活性。函数
转载自:http://www.cnblogs.com/wj033/p/5812938.html