贪睡虫
liujian.net

前面写了一篇 Unity入门。写的比较仓促,所以东西比较粗糙,正如 戏水3 所说,没起到入门的作用。
本文就从 Unity中的QuickStart中关于StopLight的例子描述下Unity在程序开发中如何使用吧。

摘要:
交通灯Demo主要介绍如何在你的应用程序中使用Unity,用户界面是一个比较简单的WinForm程序,旨在显示
交通灯的示意,红黄绿,你可以设置它们依次显示的周期。 Form窗体界面如下图:


 

类关系图如下图:

 


 

向Unity容器注册服务:
在此Demo中主要使用了2个Service,即注册实现两个接口的服务。具体事例类
容器根据需要自动创建实例。

主要两个接口是 ILoger,IStoplightTimer ,ILoger具体实现 TraceLogger,NullLogger
IStoplightTimer 实现 RealTimeTimer
Code:

 

ILogger

 

 

TraceLogger

 

IStoplightTimer

 

RealTimeTimer

 

 

我们借用Unity,即可以在容器中注册这两个服务:

 

Main

 

 

这样我们就在容器中建立了两个关系映射,即ILogger的实例TraceLogger 和
IStoplightTimer的实例 RealTimeTimer。
注意:以上说的实例还不够确切,只是一个关系映射,如果我们从容器中想要使用ILogger时,通过Resolve时,容器此时才会生成
ILogger的TranceLogger的实例。

在容器中注册了两个接口的映射关系后,我们还需要为我们的程序依赖注入一个
子对象或者暴露一个入口供我们去运行这个程序,即还要有用户界面供外部调用。
继承Windows.Form 的StoplightForm就做我们的主显示窗体吧,为确保所有的对象都是依赖注入的,我们就可以在
Program 类中通过Resolve方法生成StoplightForm,并显示。
Code:

Application.Run(container.Resolve<StoplightForm>());


使用MVP模式:


当Demo运行时,它会加载我们的用户接口,StoplightForm 窗体,该窗体实现了MVP模式, MVP模式具体如何实现在此不做多讲,有兴趣的可以去
TerryLee 的博客 ,那里面有详细的介绍。

实现了MVP模式,那么它就需要暴露一个 属性(类对象)给调用者。这个类对象即是 StoplightPresenter,这Form窗体使用属性的
Setter方法获取StoplightPresenter 实例设置presenter。

public partial class StoplightForm : Form, IStoplightView
{
  private StoplightPresenter presenter;
  [Dependency]
  public StoplightPresenter Presenter
  {
    get { return presenter; }
    set
    {
      presenter = value;
      presenter.SetView(this);
    }
  }
  ...

注意: 必须确保Untity在创建StoplightForm 之前创建Presenter,这样依赖注入的类才能被注入,生成StoplightPresenter。


通过属性 Setter注入业务组件:

private Stoplight stoplight;

 

[Dependency]
public Stoplight Stoplight
{
  get { return stoplight; }
  set { stoplight = value; }
}

 

同样 Presenter 也需要一个依赖对象StoplightSchedule ,Code:


private StoplightSchedule schedule;

[Dependency]
public StoplightSchedule Schedule
{
  get { return schedule; }
  set { schedule = value; }
}


至此,此Demo需要依赖注入的对象已完成,在Unity已经成功生成了个对象之间的映射关系。


后注:

Demo旨在演示通过Unity依赖注入对象,来实现我们想要的功能。 比如ILogger。TraceLogger是我们在程序初期就已经设计好了,
并确定使用它。那么我们在一开始就可以通过Untity的RegisteType进行关系映射。 但是 有时需求并不是在一开始就能取诶的那个。
比如,在后期程序中的ILogger接口我们需要使用FileLogger记录,那我们就要重新修改代码,重新编译了。

其实Untity中我们可以通过 配置文件 进行动态注册。需要使用哪种日志直接通过修改配置文件就可以了。

下篇将介绍如何使用配置文件进行Unity动态注册及映射关系。 

不足之处,请包涵。谢谢

Demo代码:下载

 

 


 

posted on 2009-01-19 10:10  vivlan  阅读(2797)  评论(3编辑  收藏  举报