面向服务支持简介
在该平台,一个服务由服务契约+服务实现组成。服务契约为服务接口,而服务实现则是实现服务接口的类。一般来讲服务契约由一个模块或者一个通用的程序集定义,服务实现模块和服务使用模块则都依赖于服务契约模块或者程序集。服务实现模块在激活器的Start方法中,利用传入该方法的参数context的AddService方法来注册服务,而服务使用模块则利用其激活器Start方法中的context的GetService或者GetFirstOrDefaultService来获取服务并使用。
面向服务设计示例
1 新建一个名为ServiceModuleShell的控制台宿主应用程序。
2 添加一个ServiceContractModule控制台插件模块,其位置指向ServiceModuleShell的bin\plugins位置。ServiceContractModule用于定义服务的契约。
(1)删除Activator,同时删除Manifest.xml中关于Activator的定义,并设置StartLevel为2(确保该模块最早启动),如下。
<?xml version="1.0" encoding="utf-8" ?> <Bundle xmlns="urn:uiosp-bundle-manifest-2.0" SymbolicName="ServiceContractModule" StartLevel="2"> <Runtime> <Assembly Path="bin\ServiceContractModule.dll"/> </Runtime> </Bundle>
(2)添加一个ISayHelloService接口,该接口是SayHello服务的契约。
namespace ServiceContractModule { public interface ISayHelloService { string Hello(string name); } }
3 新建一个名为ServiceProviderModule的服务插件。
(1)添加对ServiceContractModule程序集引用,设置“复制本地”属性为false。
(2)删除Manifest.xml中Services定义,修改启动级别为3(在ServiceContractModule模块之后启动),添加对ServiceContractModule模块依赖。
<?xml version="1.0" encoding="utf-8" ?> <Bundle xmlns="urn:uiosp-bundle-manifest-2.0" SymbolicName="ServiceProviderModule" StartLevel="3"> <Activator Type="ServiceProviderModule.Activator"/> <Runtime> <Assembly Path="bin\ServiceProviderModule.dll"/> <Dependency BundleSymbolicName="ServiceContractModule"/> </Runtime> </Bundle>
(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<ISayHelloService>(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依赖。
<?xml version="1.0" encoding="utf-8" ?> <Bundle xmlns="urn:uiosp-bundle-manifest-2.0" SymbolicName="ServiceConsumerModule" StartLevel="4"> <Activator Type="ServiceConsumerModule.Activator"/> <Runtime> <Assembly Path="bin\ServiceConsumerModule.dll"/> <Dependency BundleSymbolicName="ServiceContractModule"/> </Runtime> </Bundle>
(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<ISayHelloService> sayHelloServiceImpls = context.GetService<ISayHelloService>(); if (sayHelloServiceImpls != null && sayHelloServiceImpls.Count > 0) { // 从所有实现中选择其中一个并调用该服务。在这个示例,我们直接挑选了第一个服务。 Console.WriteLine(sayHelloServiceImpls[0].Hello("ServiceConsumerModule")); } } public void Stop(IBundleContext context) { } } }
6 运行工程,结果如下。

