省市查询MVP
一、需求分析
选择省份,给出下辖的市;选择市,给出下辖的区县。
二、概要设计
首先,Model-view-presenter (MVP) 是使用者接口设计模式的一种,被广范用于便捷自动化单元测试和在呈现逻辑中改良分离关注点(separation of concerns)。
· Model 定义使用者接口所需要被显示的资料模型,一个模型包含着相关的商业逻辑。
· View 视图为呈现使用者接口的终端,用以表现来自 Model 的资料,和使用者命令路由再经过 Presenter 对事件处理后的资料。
· Presenter 包含着元件的事件处理,负责检索 Model 取得资料,和将取得的资料经过格式转换与 View 进行沟通。
在MVP模式中View并不直接使用Model,他们之间的通信是通过Presenter来进行的,所有的交互都发生在Presenter内部。
Presenter类图
三、主要代码
(1) Presenter
using System;
usingSystem.Collections.Generic;
using System.Linq;
using System.Text;
namespace Presenter
{
public interface IPresenter
{
void ShowProvinces();
void ShowCities(int provinceId);
void ShowDistricts(int cityId);
}
using System;
usingSystem.Collections.Generic;
using System.Linq;
using System.Text;
using Domain;
usingSystem.ComponentModel.Composition;
usingSystem.ComponentModel.Composition.Hosting;
using IRepository;
namespace Presenter
{
[Export(typeof(IPresenter))]
public class MyPresenter : IPresenter
{
private IView _view;
[ImportingConstructor]
public MyPresenter(IView view)
{
_view = view;
}
[Import]
private IData _data;
public void ShowCities(int provinceId)
{
_view.Cities = _data.Cities.Where(t=> t.ProvinceId == provinceId).OrderBy(t => t.CitySort).ToList();
}
public void ShowDistricts(int cityId)
{
_view.Districts =_data.Districts.Where(t => t.CityId == cityId).OrderBy(t =>t.DisSort).ToList();
}
public void ShowProvinces()
{
_view.Prvinces =_data.Provinces.OrderBy(t => t.ProSort).ToList();
}
}
}
(2) UI
using System;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
usingSystem.Threading.Tasks;
usingSystem.Windows.Forms;
using Domain;
using Presenter;
usingSystem.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
namespace QueryUI
{
[Export(typeof(IView))]
public partial class Form1 : Form, IView
{
[Import]
private IPresenter _presenter;
public Form1()
{
InitializeComponent();
cmb_Province.DisplayMember = "ProName";
cmb_Province.ValueMember = "ProId";
cmb_City.DisplayMember = "CityName";
cmb_City.ValueMember = "CityId";
cmb_District.DisplayMember = "DisName";
cmb_District.ValueMember = "DisId";
//_presenter = new MyPresenter(this);
MyComposePart();
}
//宿主MEF并组装部件
internal void MyComposePart()
{
//获取特定类型的Assemble
var catelog = new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory);
//初始化MEF容器
var container = new CompositionContainer(catelog);
//向容器添加部件
container.ComposeParts(this);
}
private void Form1_Load(object sender, EventArgs e)
{
_presenter.ShowProvinces();
}
private void cmb_Province_SelectedIndexChanged(object sender, EventArgs e)
{
var provinceId = (int)cmb_Province.SelectedValue;
_presenter.ShowCities(provinceId);
}
private void cmb_City_SelectedIndexChanged(object sender, EventArgs e)
{
var cityId = (int)cmb_City.SelectedValue;
_presenter.ShowDistricts(cityId);
}
private void cmb_District_SelectedIndexChanged(object sender, EventArgs e)
{
}
public IEnumerable<Province> Prvinces { set{ cmb_Province.DataSource = value; } }
public IEnumerable<City> Cities { set { cmb_City.DataSource = value; } }
public IEnumerable<District> Districts { set{ cmb_District.DataSource = value; } }
}
}
四、运行结果