CTK 插件框架介绍

CTK 插件框架介绍CTKPluginFramework:IntroductionTheCTKPluginFrameworkcanshortlybedescribedasadynamiccomponentsystemforC++.CTK插件框架可以简要的描

大家好,又见面了,我是你们的朋友全栈君。

CTK Plugin Framework: Introduction

The CTK Plugin Framework can shortly be described as a dynamic component system for C++.

CTK 插件框架可以简要的描述为一个c++动态组件系统。

Contents

[hide]

Design

The design of the CTK Plugin Framework (see also the Design Document) is heavily inspired by OSGi (a dynamic component system for Java) and enablesa development model where applications are (dynamically) composed of many different (reusable) components. This modelallows to communicate throughservices, which are objects that are specifically shared between components.

The framework’s layered model is illustrated in Figure 1, containing:

CTK 插件框架介绍

Figure 1: Layered Model of the CTK Plugin Framework

  • Plugins – Plugins are the CTK components created by the developers.
  • Services Layer – Connects plugins in a dynamic way by offering a publish-find-bind model for C++ objects.
  • Life Cycle Layer – The API to install, start, stop, update, and uninstall plugins.
  • Security – Handles security aspects (not available yet)

A more detailed explanation of these concepts can be found below.

Plugins

A CTK Plugin is, at it’s core, a shared library based on the Qt Plugin system.Additionally, symbols in CTK libraries are by default hidden across all platforms. This is the first step towardsmodularity,which is about keeping things local and not shared. The less things you share, the less wrong assumptions can be made. However, withoutsharing there can be no collaboration. CTK Plugins usually only share symbols (classes and functions) to support the CTK services model.

Services

A collaborative model in C++ is usually realized with the use of factory patterns. Different toolkits use different patterns and APIto access such a factory. Very often, influencing the decision about which implementation is used by the factory is non-trivial. Further, theimplementation code can usually not advertise its availability, nor can the user list the possible implementations and pick the most suitableone. Factories are also in general not dynamic, once an instance of an implementation is registered, it can not be withdrawn. Finally, ifmany different factories are in use, there is no centralized overview of the implementations to which your code is bound.

One solution to these issues is the CTK service registry. A plugin can create an object and register it with the CTK service registry underone or moreinterfaces (an interface is a C++ class with usually only pure virtual methods). Other plugins can ask the registry to list all services (objects)that are registered under a specific interface. A plugin may even wait for a specific service to appear and then get a call back.

A plugin can therefore register a service, it can get a service, and it canlisten for a service to appear or disappear.An arbitrary number of plugins can register services under the same interface, and any number of plugins can get the same service, see Figure 2.

CTK 插件框架介绍

Figure 2: Registering and getting a service

If multiple plugins register objects under the same interface, they can be distinguished by theirproperties. Each service registration has a set ofstandard and custom properties. You can use an expressive filter language to select only the services in which you are interested. Properties canalso be used for other roles at the application level.

Since services are dynamic, a plugin can decide to withdraw its service from the registry while other plugins are still using it. Plugins using sucha service must then ensure that they no longer use the service object and drop any pointers to it. This may sound like a significantadditional complexity at first, but using helper classes likectkServiceTracker and aframework like Declarative Services (to be developed) can make this process straight-forward and the gained advantages are quite large.The dynamic nature of services allows to install and uninstall plugins on the fly while other plugins stay functional. It also models real worldproblems closer because most often, such problems are not static. For example in a distributed environment a service could model a connection end-pointand if the connection to the remote machine is gone, the service can be withdrawn. Further, the dynamics solve the initialization problem. Applicationsusing CTK Plugins do not require a specific start ordering in their plugins.

Though the service registry accepts any QObject-based object as a service, the best way to achieve reuse is to register these objects under (standard)interfaces to decouple the implementation from the client code. Hence the CTK Plugin Framework provides a number of standard interfaces which aredesigned closely to the service specifications published in theOSGi Service Platform Release 4 Compendium Specification.These standard services are described in detail in the specification and on this Wiki.

Deployment

The CTK Plugin Framework can be used as the main container for all your application logic, but it can also be embedded in your existing framework.The management of the framework is standardized by providing a simple API allowing plugins to install, start, stop, and update other plugins,as well as enumerating the plugins and their service usage. This APIcan be used by so-calledmanagement agents to control the Plugin Framework. Management agents can be as diverse as command shells, richgraphical desktop applications, or an AJAX-application.

Benefits

The CTK Plugin Framework is based on OSGi principles and APIs. As such, it inherits a very mature and thoroughly designed component system thatis used in the Java world to build highly complex applications. It brings those benefits to native (Qt based) C++ applications. The following listis taken from Benefits of Using OSGi and adapted to the CTK context.

Reduced Complexity

Developing with the CTK Plugin Framework means developing plugins. They hide their internals from other plugins and communicate through well defined
services. Hiding internals means more freedom to change later. This not only reduces the number of bugs, it also makes plugins simpler to develop because correctly sized plugins implement a piece of functionality through well defined interfaces.

Reuse

The standardized component model makes it very easy to use third party components in an application.

Real World

The CTK Plugin Framework is dynamic. It can update plugins on the fly and services can come and go. There are a surprising number of real world scenarios that match this dynamic service model. Applications can therefore reuse the powerful primitives of the service registry (register, get, list with an expressive filter language, and waiting for services to appear and disappear) in their own domain. This not only saves writing code, it also provides global visibility, debugging tools, and more functionality than would have implemented for a dedicated solution. Writing code in such a dynamic environment sounds like a nightmare, but fortunately, there are support classes and frameworks that take most, if not all, of the pain out of it.

Easy Deployment

The CTK Plugin Framework is not just a standard for components. It also specifies how components are installed and managed. This API can be used by plugins to provide a management agent. This management agent can be as simple as a command shell, a graphical desktop application, a cloud computing interface for Amazon’s EC2, or an IBM Tivoli management system. The standardized management API makes it very easy to integrate the CTK Plugin Framework in existing and future systems.

Dynamic Updates

The used OSGi component model is a dynamic model. Plugins can be installed, started, stopped, updated, and uninstalled without bringing down the whole system.

Adaptive

The used OSGi component model is designed from the ground up to allow the mixing and matching of components. This requires that the dependencies of components need to be specified and it requires components to live in an environment where their optional dependencies are not always available. The service registry is a dynamic registry where plugins can register, get, and listen to services. This dynamic service model allows plugins to find out what capabilities are available on the system and adapt the functionality they can provide. This makes code more flexible and resilient to changes.

Transparency

Plugins and services are first class citizens in the CTK Plugin environment. The management API provides access to the internal state of a plugin as well as how it is connected to other plugins. Parts of the applications can be stopped to debug a certain problem, or diagnostic plugins can be brought in.

Versioning

In the CTK Plugin Framework, all plugins are carefully versioned and only plugins that can collaborate are wired together.

Simple

The CTK Plugin API is surprisingly simple. The core API is less than 25 classes. This core API is sufficient to write plugins, install them, start, stop, update, and uninstall them and includes all listener classes.

Lazy

Lazy in software is good and the used OSGi technology has many mechanisms in place to do things only when they are really needed. For example, plugins can be started eagerly, but they can also be configured to only start when another plugin is using them. Services can be registered but only created when they are used. These kind of lazy scenarios can save tremendous runtime costs.

Humble

The CTK Plugin Framework does not take over your whole application. You can choose to expose the provided functionality to just parts of your application, or even run multiple instances of the framework inside the same process.

Non Intrusive

Applications (plugins) in a CTK Plugin environment are left to their own. They can use any facilities without the framework restricting them. There is no special interface required for CTK services, every QObject can act as a service and every class (also non-QObject based) can act as an interface.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/137564.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 教你保存在线视频文件「建议收藏」

      当你看到很精彩的视频你想不想把他保存起来以后继续欣赏呢?或者是做成MP4格式放到手机里??但是目前绝大部分的视频网站由于版权、带宽等原因不提供视频下载服务,甚至想方设法把这些视频资源藏起来。所以你无法把它们保存到自己的电脑上。我们要怎么样才能把别人的视频文件保存到自己的电脑上呢?下面教你几招保存视频文件,让我们来突破封锁,把在线视频搬回家,想看就看!  一、WMV、ASF…

    2022年4月6日
    116
  • sencha touch 自定义cardpanel控件 模仿改进NavigationView …

    sencha touch 自定义cardpanel控件 模仿改进NavigationView …

    2021年8月26日
    53
  • 微型计算机及其接口技术

    微型计算机及其接口技术一.微机总线微机中总线一般有内部总线:是微机内部各外围芯片与处理器之间的总线,用于芯片一级的互连系统总线:是微机中各插件板与系统板之间的总线,用于插件板一级的互连1.ISA(industria

    2022年7月1日
    21
  • 钩子函数介绍(vue11个钩子函数)

    钩子(hook)又称钩子函数,是在一个有序的周期中的某些特殊时刻,系统内部预先设置好的函数,当系统周期到达指定时刻会自动执行该’钩子’。钩子函数的函数体内容由开发者编写,这绐了幵发者在不同阶段做某些处理的机会。钩子是很多开发语言,前后端都会涉及的概念,是一种形象的说法,源于Windows的消息处理机制。通过设置钩子,应用程序在消息过去前将其钩住,阻止其传递,然后优先处理开发者的自定义内容,俗称’下个钩子’。系统:初始化..钩子ready()运行..钩子beforeEnd(…

    2022年4月12日
    75
  • MySQL索引的创建与使用

    MySQL索引的创建与使用索引有很多,且按不同的分类方式,又有很多种分类。不同的数据库,对索引的支持情况也不尽相同。声明:本人主要简单示例MySQL中的单列索引、组合索引的创建与使用。索引的创建:建表时创建:CREATETABLE表名(字段名数据类型[完整性约束条件],……,[UNIQUE|FULLTEXT|SPATIAL]INDEX|KEY[索引名](字…

    2022年5月30日
    44
  • CAS原理详解_外燃机工作原理

    CAS原理详解_外燃机工作原理CAS简介CAS的意思是compareandswap,比较并交换。CAS的引入是为了解决java锁机制带来的性能问题。锁机制存在以下问题:(1)在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。(2)一个线程持有锁会导致其它所有需要此锁的线程挂起。(3)如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能风险。解决线程安全问题volatile是不错的机制,但是volatile不能保证原子性。因此对于同步最终还是要回到锁机制上来。独占锁

    2022年10月16日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号