文/flyabroad 出处/博客园
StopLight 是 Unity QuickStart 中包含的实例,用于展示依赖注入,同时使用了 MVP 模式,本文演示将 StopLight 移植到 SCSF ,本篇及以后的几篇文章会依据 StopLight 实例来详细说明 SCSF 的依赖注入,MVP 模式和面向对象的设计原则。StopLight 的设计当然还不完美,但通过它我们可以体会到面向对象设计的和谐和优雅。
一:需求依次显示绿、黄、红三种颜色,各种颜色的现实时间可以用户手工输入,用户也可以手动强制显示下一个颜色。将显示信息记入日志。
运行界面:

附件:
您所在的用户组无法下载或查看附件
附件:
您所在的用户组无法下载或查看附件 二:简单设计(以后部分会详细讨论为什么这样设计)1 StoplightView(StopLightForm )具体的现实窗体,提供用户操作接口。
责任:
1.1 实现IStoplightView接口
public partial class StopLightView : UserControl, IStopLightView
1.2 提供事件处理器声明及辅助的事件触发器
public event PropertyChangedEventHandler PropertyChanged;
1.3 指定Presenter
[Dependency]
public StoplightPresenter Presenter
1.4 触发响应事件
RaisePropertyChanged(StoplightViewProperties.RedDuration);
1.5 通过ErrorProvider提示用户输入错误
errorProvider.SetError(controlsByName[propertyName], errorMessage);
2 IStoplightView定义每个具体的StoplightView都应该提供的接口,继承自INotifyPropertyChanged。
责任:
2.1 当前颜色
Color CurrentColor { get; set; }
2.2 每种颜色的显示时间
string GreenDuration { get; set; }
string YellowDuration { get; set; }
string RedDuration { get; set; }
2.3 设置错误信息
void SetError(string propertyName, string errorMessage);
2.4 相应的事件处理器
event EventHandler UpdateClicked;
event EventHandler ForceChangeClicked;
3 StoplightPresenter实现了MVP模式中的Presenter角色。
责任:
3.1 设置Presenter对于的View
public void SetView(IStoplightView view);
3.2 注册View的事件处理程序
view.PropertyChanged += OnViewPropertyChanged;
view.UpdateClicked += OnViewUpdateClicked;
view.ForceChangeClicked += OnViewForceChangeClicked;
3.2 定义View的事件处理程序
从View获取需要的信息,通过IStoplightView接口
更新View,通过IStoplightView接口
ServiceInterfaces层(StopLight.Interface项目)提供服务接口,体现面向接口编程,ServiceImplementations层(StopLight项目)实现具体的接口。接口定义是唯一的,但对接口的实现是不限的。Presenter依赖于抽象的接口而不是具体的服务实现,这样为以后更改具体的服务实现提供了方便。
Logic层(StopLight项目,放在服务中)负责具体的业务逻辑并记录日志。
Stoplight:获取当前颜色:
public StoplightColors CurrentColor
切换到下一个颜色:
public void Next()
StoplightSchedule:根据时间或者用户强制调度颜色。
开始定时器:
public void Start()
更改显示间隔:
public void Update(TimeSpan green, TimeSpan yellow, TimeSpan red)
强制改变:
public void ForceChange()
三、利用 Smart Client Software Factory 实现利用第一篇中的介绍建立框架,建立一个新的解决方案文件夹 StopLight ,并利用 Smart Client Factory 的 Package Guidance 功能建立一个包含接口层的 Business Module 。项目结构如下:

附件:
您所在的用户组无法下载或查看附件这时 Shell 项目下的 ProfileCatalog.xml 文件自动更新,添加了对 StopLight.dll 的引用:

Code
1 <SolutionProfile xmlns="http://schemas.microsoft.com/pag/cab-profile/2.0">
2 <Section Name="Layout">
3 <Modules>
4 <ModuleInfo AssemblyFile="Infrastructure.Layout.dll" />
5 </Modules>
6 </Section>
7 <Section Name="Services">
8 <Dependencies>
9 <Dependency Name="Layout" />
10 </Dependencies>
11 <Modules>
12 <ModuleInfo AssemblyFile="Infrastructure.Module.dll" />
13 </Modules>
14 </Section>
15 <Section Name="Apps">
16 <Dependencies>
17 <Dependency Name="Layout" />
18 <Dependency Name="Services" />
19 </Dependencies>
20 <Modules>
21 <ModuleInfo AssemblyFile="StopLight.dll" /> <!--注意-->
22 </Modules>
23 </Section>
24 </SolutionProfile>
您可能对 [Visual Studio.NET] 的这些文章也感兴趣: