Stevedore - (Dynamic Code Patterns: Extending Your Applications with Plugins)
来源:互联网 发布:淘宝如何设置公益宝贝 编辑:程序博客网 时间:2024/05/16 02:55
this deck in here.
The ExtensionManager is created slightly differently from the DriverManager because it does not need to know in advance which plugin to load. It loads all of the plugins it finds.
To call the plugins, use the map() method, passing a callable to be invoked for each extension. The format_data() function used withmap() in this example takes two arguments, the Extension and the data argument given to map().
The Extension passed format_data() is a class defined by stevedore that wraps the plugin. It includes the name of the plugin, theEntryPoint returned by pkg_resources, and the plugin itself (the named object referenced by the plugin definition). Wheninvoke_on_load is true, the Extension will also have an obj attribute containing the value returned when the plugin was invoked.
map() returns a sequence of the values returned by the callback function. In this case, format_data() returns a tuple containing the extension name and the iterable that produces the text to print. As the results are processed, the name of each plugin is printed and then the formatted data.
Why Not Call Plugins Directly?
Using a separate callable argument to map(), rather than just invoking the plugin directly introduces a separation between your application code and the plugins. The benefits of this separation manifest in the application code design and in the plugin API design.
If map() called the plugin directly, each plugin would have to be a callable. That would mean a separate namespace for what is really just a method of the plugin. By using a separate callable argument, the plugin API does not need to match exactly any particular use case in the application. This frees you to create a finer-grained API, with more individual methods that can be called in different ways to achieve different goals.
- Stevedore - (Dynamic Code Patterns: Extending Your Applications with Plugins)
- Addison.Wesley.Mongrel.Serving.Deploying.and.Extending.Your.Ruby.Applications
- Mongrel: Serving, Deploying, and Extending Your Ruby Applications
- Patterns For Building Composite Applications With WPF
- Monitor Your Applications With JConsole - Part 1
- Monitor Your Applications With JConsole - Part 2
- Monitor Your Applications With JConsole - Part 3
- Profile your applications with Java VisualVM
- Improving Your Code with lint
- HACK your code with machine code.
- stevedore
- Using Async RPC with Your Client/Server Applications
- Extending PhoneGap with native plugins for iOS (通过phonegap plugin的方式实现ios和javascript的互相调用)
- Extending maya with C#
- python extending with c++
- Automation for the people: Improving code with Eclipse plugins
- chapter 26 Extending Your Application
- Protecting Your Code with Visual C++ Defenses
- PhotonVPS系列之七:利用SSH代理上网
- Sublime Text 2中文乱码问题的解决
- 恰好K步最短路
- hdu 4497 GCD and LCM 容斥原理
- OpenStack安装部署管理中常见问题解决方法(OpenStack-Lite-FAQ)
- Stevedore - (Dynamic Code Patterns: Extending Your Applications with Plugins)
- Myeclipse远程debug配置
- XCODE搭建SVN环境
- 手机网络电话SIP帐户,节省话费,真正免费互打
- 解决惠普P10008激光打印机重启驱动消失的问题
- Halcon C#.net 编程指导(5): 异常处理(Error Handing)
- ssh的一些安全设定
- POJ 2828 Buy Tickets
- UVa 455 Periodic Strings (字符串处理)