OSGI.NET 服务示例

面向服务支持简介

在该平台,一个服务由服务契约+服务实现组成。服务契约为服务接口,而服务实现则是实现服务接口的类。一般来讲服务契约由一个模块或者一个通用的程序集定义,服务实现模块和服务使用模块则都依赖于服务契约模块或者程序集。服务实现模块在激活器的Start方法中,利用传入该方法的参数contextAddService方法来注册服务,而服务使用模块则利用其激活器Start方法中的contextGetService或者GetFirstOrDefaultService来获取服务并使用。

面向服务设计示例

1 新建一个名为ServiceModuleShell的控制台宿主应用程序。

2 添加一个ServiceContractModule控制台插件模块,其位置指向ServiceModuleShellbin\plugins位置。ServiceContractModule用于定义服务的契约。

1)删除Activator,同时删除Manifest.xml中关于Activator的定义,并设置StartLevel2(确保该模块最早启动),如下。

<?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.xmlServices定义,修改启动级别为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 运行工程,结果如下。

image.png


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864