您好,欢迎来到九壹网。
搜索
您的当前位置:首页OSGI服务示例说明

OSGI服务示例说明

来源:九壹网


服务示例

面向服务支持简介

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

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 91gzw.com 版权所有 湘ICP备2023023988号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务