CAB之Service
如何使用Service?本文以一个例子来说明具体的设计过程。
我们把方法的声明和实现分开来,所以用到了接口。
1. 在接口文件中定义接口IGPSService,其中声明了两个方法GetLatitude和GetLongitude
public interface IGPSService
{
int GetLatitude();
int GetLongitude();
}
2. 接下来在类GPSService中实现这些方法
[Service(typeof(IGPSService))]
public class GPSService : IGPSService
{
public GPSService()
{
MessageBox.Show("Service constructor");
}
public int GetLatitude()
{
return 42;
}
public int GetLongitude()
{
return 125;
}
}
可以看到这个类的实现唯一与平常不同的就是开头处的 [Service(typeof(IGPSService))],这是利用Service属性来
使得一个类自动注册成为WorkItem的Service成员。这样CAB就可以非常容易地找到这个服务的实现。用了type,就可
以在不影响其他引用该服务的代码的前提下,改变这个服务的实现。
注:有一种服务叫On-demand Service。当定义了很多服务时,如果在初始化的时候都load到内存中效率是很低的。在
调用这个服务的时候才load到内存是比较好的方法。只要在服务的实现类中声明AddOnDemand属性为true就可以了。eg:
[Service(typeof(***), AddOnDemand = true)]
3.至此,Service部分已经实现好了。当在某个View中需要调用一个服务的时候,需要在View的类中加上下面的代码,使View与
服务联系起来。
private IGPSService gpsService;
[ServiceDependency] //tell CAB that this class has a dependency on IGPSService
//you have not initialized a new service, you want to use a service that
//has already created and stored.
public IGPSService GPS
{
set { gpsService = value; }
}
上面的代码告诉CAB,这个类依赖于IGPSService,你想用一个已经被创建的服务,而不是一个新服务。 CAB就用[ServiceDependency] 来实现这个目的。只要在属性前加上这个,就会在一个View添加到WorkItem时自动初始化这个服务。
要在View中使用这个服务,就要添加这个依赖。
4. 在View中调用服务。比如现在要使用服务中的GeLatitude方法。那么只需要
gpsService.GetLatitude()就可以了。
这样就基本完成了服务的设计和与view的连接。还有一些与WorkItem的联系,在具体应用中在做考虑。