面向服务支持简介
在该平台,一个服务由服务契约+服务实现组成。服务契约为服务接口,而服务实现则是实现服务接口的类。一般来讲服务契约由一个模块或者一个通用的程序集定义,服务实现模块和服务使用模块则都依赖于服务契约模块或者程序集。服务实现模块在激活器的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 运行工程,结果如下。



少有人走的路



















