服务示例
面向服务支持简介
在该平台,一个服务由服务契约+服务实现组成。服务契约为服务接口,而服务实现则是实现服务接口的类。一般来讲服务契约由一个模块或者一个通用的程序集定义,服务实现模块和服务使用模块则都依赖于服务契约模块或者程序集。服务实现模块在激活器的Start方法中,利用传入该方法的参数context的AddService方法来注册服务,而服务使用模块则利用其激活器Start方法中的context的GetService或者GetFirstOrDefaultService来获取服务并使用。
面向服务设计示例
1 新建一个名为ServiceModuleShell的控制台宿主应用程序。
2 添加一个ServiceContractModule控制台插件模块,其位置指向ServiceModuleShell的bin\\plugins位置。ServiceContractModule用于定义服务的契约。
(1)删除Activator,同时删除Manifest.xml中关于Activator的定义,并设置StartLevel为2(确保该模块最早启动),如下。
SymbolicName=\"ServiceContractModule\" StartLevel=\"2\">
(2)添加一个ISayHelloService接口,该接口是SayHello服务的契约。
namespace ServiceContractModule
{
public interface ISayHelloService
{
string Hello(string name);
}
}
3 新建一个名为ServiceProviderModule的服务插件。
(1)添加对ServiceContractModule程序集引用,设置“复制本地”属性为false。
(2)删除Manifest.xml中Services定义,修改启动级别为3(在ServiceContractModule模块之后启动),添加对ServiceContractModule模块依赖。
(3)添加SayHelloService类,该类实现了ISayHelloService接口
namespace ServiceProviderModule.Impl
{
class SayHelloService : ISayHelloService
{
public string Hello(string name)
{
return string.Format(\"[ServiceProviderModule] Hello, {0}.\", name);
}
}
}
(4)在激活器中注册该服务。
using System;
using System.Collections.Generic;
using UIShell.OSGi;
using ServiceContractModule;
using ServiceProviderModule.Impl;
namespace ServiceProviderModule
{
public class Activator : IBundleActivator
{
public void Start(IBundleContext context)
{
// 添加一个服务时,这个服务的实例在模块被停止时,系统会自动将其删除并释放。
// 因此,用户可以不必在Stop中删除服务。
context.AddService(new SayHelloService());}
public void Stop(IBundleContext context)
{
}
}
}
4新建一个名为ServiceProviderModule2的服务插件。过程类似步骤3,其启动级别为3,服务实现如下。
using System;
using System.Collections.Generic;
using System.Text;
using ServiceContractModule;
namespace ServiceProviderModule2.Impl
{
public class SayHelloService2 : ISayHelloService
{
public string Hello(string name)
{
return string.Format(\"[ServiceProviderModule2] Hi, {0}!\", name);
}
}
}
5 新建一个名为ServiceConsumerModule的控制台插件应用程序。
(1)更改启动级别为4(服务使用模块最晚启动,此时已经添加到框架),并添加对服务契约模块ServiceContractModule依赖。
(2)在激活器中,通过IBundleContext查询并绑定一个服务,然后使用。
using System;
using System.Collections.Generic;
using UIShell.OSGi;
using ServiceContractModule;
namespace ServiceConsumerModule
{
public class Activator : IBundleActivator
{
public void Start(IBundleContext context)
{
// 获取实现了ISayHelloService服务契约的所有服务实现。
List sayHelloServiceImpls = context.GetService();if (sayHelloServiceImpls != null && sayHelloServiceImpls.Count > 0)
{
// 从所有实现中选择其中一个并调用该服务。在这个示例,我们直接挑选了第一个服务。
Console.WriteLine(sayHelloServiceImpls[0].Hello(\"ServiceConsumerModule\"));
}
}
public void Stop(IBundleContext context)
{
}
}
}
6 运行工程,结果如下。