<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Plugins</title><link>https://community.telligent.com/community/11/w/developer-training/65096/plugins</link><description /><dc:language>en-US</dc:language><generator>14.0.0.586 14</generator><item><title>Plugins</title><link>https://community.telligent.com/community/11/w/developer-training/65096/plugins</link><pubDate>Tue, 04 Aug 2020 19:31:25 GMT</pubDate><guid isPermaLink="false">4371f751-7ed3-44be-8e55-fd8a4bdfee6a</guid><dc:creator>Former Member</dc:creator><comments>https://community.telligent.com/community/11/w/developer-training/65096/plugins#comments</comments><description>Current Revision posted to Developer Training by Former Member on 08/04/2020 19:31:25&lt;br /&gt;
&lt;p&gt;[[api-documentation:IPlugin Plugin Type|Plugins]] are .net-based classes implementing [[api-documentation:IPlugin Plugin Type|IPlugin]]. Plugins are used to interact with Verint Community&amp;#39;s&amp;nbsp;[[api-documentation:In-Process API Documentation|in-process API]]&amp;nbsp;by being installed directly within each web- and job-scheduler- node running the Verint Community platform.&lt;/p&gt;
&lt;p&gt;&lt;a href="/cfs-file/__key/communityserver-wikis-components-files/00-00-00-12-83/Plugins-and-Framework.png"&gt;&lt;img alt=" " src="/resized-image/__size/1040x0/__key/communityserver-wikis-components-files/00-00-00-12-83/Plugins-and-Framework.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[[api-documentation:IPlugin Plugin Type|IPlugin]] is the base interface for all [[api-documentation:Plugin API Documentation|plugins]]. Additional, special-use plugin types extend &lt;code&gt;IPlugin&lt;/code&gt; to provide access to use-case-specific functionality and provide a tighter integration with components of Verint Community. For example, the [[api-documentation:IActivityStoryType Plugin Type|IActivityStoryType plugin interface]] extends &lt;code&gt;IPlugin&lt;/code&gt; to provide support for extending the Verint Community&amp;nbsp;activity stream.&lt;/p&gt;
&lt;p&gt;The [[api-documentation:PluginManager In-Process API Service|plugin manager]] both manages the [[Plugin Lifecycle|lifecycle]] of plugins and provides access for retrieving instances of specific plugin types.&lt;/p&gt;
&lt;p&gt;[toc]&lt;/p&gt;
&lt;h2&gt;&lt;a name="Getting_started"&gt;&lt;/a&gt;Getting started&lt;/h2&gt;
&lt;p&gt;Plugins are .net classes implementing one or more [[api-documentation:Plugin API Documentation|plugin interfaces]]. To create a new plugin:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;[[Setting Up Your Development Environment|Set up your development environment]] for Verint Community.&lt;/li&gt;
&lt;li&gt;Create a new .NET class library project in Visual Studio using .net 4.x.&lt;/li&gt;
&lt;li&gt;Add a reference to the Verint Community&amp;nbsp;assembly identified in the documentation associated to the [[api-documentation:Plugin API Documentation|plugin]] you want to implement. For example, to implement [[api-documentation:IPlugin Plugin Type|IPlugin]], a reference to Telligent.Evolution.Components.dll is required.&lt;/li&gt;
&lt;li&gt;Create a new public class in your class library project.&lt;/li&gt;
&lt;li&gt;Implement the plugin type. For example, the following class would implement IPlugin:&lt;br /&gt;&lt;pre class="ui-code" data-mode="csharp"&gt;using System;

namespace Samples
{
        public class MyPlugin : Telligent.Evolution.Extensibility.Version1.IPlugin
        {
        }
}&lt;/pre&gt;&lt;br /&gt;Right-click the IPlugin reference in the code and select &amp;quot;Implement Interface&amp;quot; and Visual Studio will stub out the implementation of the plugin type. For example, the code above, once stubbed out, results in:&lt;br /&gt;&lt;pre class="ui-code" data-mode="csharp"&gt;using System;

namespace Samples
{
	public class MyPlugin : Telligent.Evolution.Extensibility.Version1.IPlugin
	{
		#region IPlugin Members

		public string Name
		{
			get { throw new NotImplementedException(); }
		}

		public string Description
		{
			get { throw new NotImplementedException(); }
		}

		public void Initialize()
		{
			throw new NotImplementedException();
		}

		#endregion
	}
}&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;Update the plugin&amp;#39;s &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;Name&lt;/span&gt; and &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;Description&lt;/span&gt;. These properties are read to identify this plugin within the administration UI (where plugins are categorized, enabled, and configured).&lt;/li&gt;
&lt;li&gt;Implement the members defined by the plugin type. This is what defines what your plugin does. For example, it may attach an event handler to an event exposed by the [[api-documentation:In-Process API Documentation|In-process API]] and perform an action when that event occurs.&lt;/li&gt;
&lt;li&gt;Build the solution.&lt;/li&gt;
&lt;li&gt;Copy the resulting assembly (Samples.dll for example) into the web/bin/ folder of each&amp;nbsp;Verint Community&amp;nbsp;web node and&amp;nbsp;job scheduler instance.&lt;/li&gt;
&lt;li&gt;As an administrator, go to &lt;strong&gt;Administration&lt;/strong&gt;, browse the existing categories or search for your plugin, enable the plugin, and save the changes.&lt;/li&gt;
&lt;li&gt;Your plugin is now running within Verint Community.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;&lt;a name="Best_practices"&gt;&lt;/a&gt;Best practices&lt;/h2&gt;
&lt;p&gt;There are a few best practices to keep in mind when developing plugins:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ensure that the plugin class is publicly accessible.&lt;/li&gt;
&lt;li&gt;Either don&amp;#39;t define an explicit constructor or ensure that a public, parameterless constructor exists. The public, parameterless constructor is the one used by the plugin manager to instantiate your plugin.&lt;/li&gt;
&lt;li&gt;Register event handlers within the &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;Initialize()&lt;/span&gt; method only.&lt;/li&gt;
&lt;li&gt;Do not attach to any resources (database, file system, etc.) until the plugin&amp;#39;s&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt; Initialize()&lt;/span&gt; method has been called.&lt;/li&gt;
&lt;li&gt;Implement more than one plugin interface with a single plugin class. Plugin types are all interfaces to enable implementing many interfaces with a single concrete class.&lt;/li&gt;
&lt;li&gt;Make use of other base plugin types when needed:
&lt;ol&gt;
&lt;li&gt;[[api-documentation:IInstallablePlugin Plugin Type|IInstallablePlugin]] enables plugins to implement their own installation lifecycle with support for installation, upgrades, downgrades, and uninstallation.&lt;/li&gt;
&lt;li&gt;[[api-documentation:IConfigurablePlugin Plugin Type|IConfigurablePlugin]] enables plugins to expose configuration on the Manage Plugins page of the Control Panel.&lt;/li&gt;
&lt;li&gt;[[api-documentation:IRequiredConfigurationPlugin Plugin Type|IRequiredConfigurationPlugin]] ensures that a minimal amount of configuration information is provided by users before allowing the plugin to be enabled.&lt;/li&gt;
&lt;li&gt;[[api-documentation:IRenderableConfigurablePlugin Plugin Type|IRenderableConfigurablePlugin]] enables configurable plugins to render a custom configuration UI.&lt;/li&gt;
&lt;li&gt;[[api-documentation:IPluginGroup Plugin Type|IPluginGroup]] enables multiple dependent plugins to be enabled/disabled as a single unit.&lt;/li&gt;
&lt;li&gt;[[api-documentation:ITranslatablePlugin Plugin Type|ITranslatablePlugin]] enables plugins to manage translatable text resources.&lt;/li&gt;
&lt;li&gt;[[api-documentation:ITemplatablePlugin Plugin Type|ITemplatablePlugin]] enables text-based configuration to make use of editor-based templating.&lt;/li&gt;
&lt;li&gt;[[api-documentation:IScriptablePlugin Plugin Type|IScriptablePlugin]] enables plugins to define custom UI via widgets which can then optionally be edited within the platform widget editor.&lt;/li&gt;
&lt;li&gt;&lt;a href="/developers/w/developer90/50335/isingletonplugin-plugin-type"&gt;ISingletonPlugin &lt;/a&gt;forces only a single instance of the derived plugin type to be enabled at a time.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;&lt;a id="Learn_More_About_Plugins" name="Learn_More_About_Plugins"&gt;&lt;/a&gt;&lt;span style="font-weight:400;"&gt;Learn More About Plugins&lt;/span&gt;&lt;/h2&gt;
&lt;h3&gt;&lt;a id="Plugin_Lifecycle" name="Plugin_Lifecycle"&gt;&lt;/a&gt;&lt;span style="font-weight:400;"&gt;[[Plugin Lifecycle]]&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="font-weight:400;"&gt;Learn about the [[Plugin Lifecycle|plugin lifecycle]].&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;a id="Plugin_Examples" name="Plugin_Examples"&gt;&lt;/a&gt;&lt;span style="font-weight:400;"&gt;[[Plugin Examples]]&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="font-weight:400;"&gt;Review [[Plugin Examples|plugin examples]] to learn more about plugin implementation and specific plugin types.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;a id="Exceptions_and_Logging" name="Exceptions_and_Logging"&gt;&lt;/a&gt;&lt;span style="font-weight:400;"&gt;[[Exceptions and Logging]]&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="font-weight:400;"&gt;Plugins can utilize Verint Community&amp;#39;s exception rendering and logging capabilities to simplify error and process logging.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;a id="api-documentation_Plugin_API_DocumentationPlugin_API_Documentation" name="api-documentation_Plugin_API_DocumentationPlugin_API_Documentation"&gt;&lt;/a&gt;[[api-documentation:Plugin API Documentation|Plugin API Documentation]]&lt;/h3&gt;
&lt;p&gt;&lt;span style="font-weight:400;"&gt;View the [[api-documentation:Plugin API Documentation|Plugin API Documentation]] for the complete list of platform plugin types.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;a id="api-documentation_In-Process_API_DocumentationIn-Process_API_Documentation" name="api-documentation_In-Process_API_DocumentationIn-Process_API_Documentation"&gt;&lt;/a&gt;[[api-documentation:In-Process API Documentation|In-Process API Documentation]]&lt;/h3&gt;
&lt;p&gt;&lt;span style="font-weight:400;"&gt;Plugins primarily interact with the Verint Community platform using the&amp;nbsp;[[api-documentation:In-Process API Documentation|In-Process API]].&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;div style="font-size: 90%;"&gt;Tags: plugins, best practices&lt;/div&gt;
</description></item><item><title>Plugins</title><link>https://community.telligent.com/community/11/w/developer-training/65096/plugins/revision/2</link><pubDate>Tue, 04 Aug 2020 18:18:10 GMT</pubDate><guid isPermaLink="false">4371f751-7ed3-44be-8e55-fd8a4bdfee6a</guid><dc:creator>Former Member</dc:creator><comments>https://community.telligent.com/community/11/w/developer-training/65096/plugins#comments</comments><description>Revision 2 posted to Developer Training by Former Member on 08/04/2020 18:18:10&lt;br /&gt;
&lt;p&gt;[[api-documentation:IPlugin Plugin Type|Plugins]] are .net-based classes implementing [[api-documentation:IPlugin Plugin Type|IPlugin]]. Plugins are used to interact with Telligent Community&amp;#39;s&amp;nbsp;[[api-documentation:In-Process API Documentation|in-process API]]&amp;nbsp;by being installed directly within each web- and job-scheduler- node running the Telligent Community platform.&lt;/p&gt;
&lt;p&gt;&lt;a href="/cfs-file/__key/communityserver-wikis-components-files/00-00-00-12-83/Plugins-and-Framework.png"&gt;&lt;img alt=" " src="/resized-image/__size/1040x0/__key/communityserver-wikis-components-files/00-00-00-12-83/Plugins-and-Framework.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[[api-documentation:IPlugin Plugin Type|IPlugin]] is the base interface for all [[api-documentation:Plugin API Documentation|plugins]]. Additional, special-use plugin types extend &lt;code&gt;IPlugin&lt;/code&gt; to provide access to use-case-specific functionality and provide a tighter integration with components of Telligent Community. For example, the [[api-documentation:IActivityStoryType Plugin Type|IActivityStoryType plugin interface]] extends &lt;code&gt;IPlugin&lt;/code&gt; to provide support for extending the Telligent Community&amp;nbsp;activity stream.&lt;/p&gt;
&lt;p&gt;The [[api-documentation:PluginManager In-Process API Service|plugin manager]] both manages the [[Plugin Lifecycle|lifecycle]] of plugins and provides access for retrieving instances of specific plugin types.&lt;/p&gt;
&lt;p&gt;[toc]&lt;/p&gt;
&lt;h2&gt;&lt;a name="Getting_started"&gt;&lt;/a&gt;Getting started&lt;/h2&gt;
&lt;p&gt;Plugins are .net classes implementing one or more [[api-documentation:Plugin API Documentation|plugin interfaces]]. To create a new plugin:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;[[Setting Up Your Development Environment|Set up your development environment]] for Telligent Community.&lt;/li&gt;
&lt;li&gt;Create a new .net class library project in Visual Studio using .net 4.x.&lt;/li&gt;
&lt;li&gt;Add a reference to the Telligent Community&amp;nbsp;assembly identified in the documentation associated to the [[api-documentation:Plugin API Documentation|plugin]] you want to implement. For example, to implement [[api-documentation:IPlugin Plugin Type|IPlugin]], a reference to Telligent.Evolution.Components.dll is required.&lt;/li&gt;
&lt;li&gt;Create a new public class in your class library project.&lt;/li&gt;
&lt;li&gt;Implement the plugin type. For example, the following class would implement IPlugin:&lt;br /&gt;&lt;pre class="ui-code" data-mode="csharp"&gt;using System;

namespace Samples
{
        public class MyPlugin : Telligent.Evolution.Extensibility.Version1.IPlugin
        {
        }
}&lt;/pre&gt;&lt;br /&gt;Right-click the IPlugin reference in the code and select &amp;quot;Implement Interface&amp;quot; and Visual Studio will stub out the implementation of the plugin type. For example, the code above, once stubbed out, results in:&lt;br /&gt;&lt;pre class="ui-code" data-mode="csharp"&gt;using System;

namespace Samples
{
	public class MyPlugin : Telligent.Evolution.Extensibility.Version1.IPlugin
	{
		#region IPlugin Members

		public string Name
		{
			get { throw new NotImplementedException(); }
		}

		public string Description
		{
			get { throw new NotImplementedException(); }
		}

		public void Initialize()
		{
			throw new NotImplementedException();
		}

		#endregion
	}
}&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;Update the plugin&amp;#39;s &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;Name&lt;/span&gt; and &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;Description&lt;/span&gt;. These properties are read to identify this plugin within the administration UI (where plugins are categorized, enabled, and configured).&lt;/li&gt;
&lt;li&gt;Implement the members defined by the plugin type. This is what defines what your plugin does. For example, it may attach an event handler to an event exposed by the [[api-documentation:In-Process API Documentation|In-process API]] and perform an action when that event occurs.&lt;/li&gt;
&lt;li&gt;Build the solution.&lt;/li&gt;
&lt;li&gt;Copy the resulting assembly (Samples.dll for example) into the web/bin/ folder of each&amp;nbsp;Telligent Community&amp;nbsp;web node and&amp;nbsp;job scheduler instance.&lt;/li&gt;
&lt;li&gt;As an administrator, go to &lt;strong&gt;Administration&lt;/strong&gt;, browse the existing categories or search for your plugin, enable the plugin, and save the changes.&lt;/li&gt;
&lt;li&gt;Your plugin is now running within Telligent Community.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;&lt;a name="Best_practices"&gt;&lt;/a&gt;Best practices&lt;/h2&gt;
&lt;p&gt;There are a few best practices to keep in mind when developing plugins:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ensure that the plugin class is publicly accessible.&lt;/li&gt;
&lt;li&gt;Either don&amp;#39;t define an explicit constructor or ensure that a public, parameterless constructor exists. The public, parameterless constructor is the one used by the plugin manager to instantiate your plugin.&lt;/li&gt;
&lt;li&gt;Register event handlers within the &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;Initialize()&lt;/span&gt; method only.&lt;/li&gt;
&lt;li&gt;Do not attach to any resources (database, file system, etc.) until the plugin&amp;#39;s&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt; Initialize()&lt;/span&gt; method has been called.&lt;/li&gt;
&lt;li&gt;Implement more than one plugin interface with a single plugin class. Plugin types are all interfaces to enable implementing many interfaces with a single concrete class.&lt;/li&gt;
&lt;li&gt;Make use of other base plugin types when needed:
&lt;ol&gt;
&lt;li&gt;[[api-documentation:IInstallablePlugin Plugin Type|IInstallablePlugin]] enables plugins to implement their own installation lifecycle with support for installation, upgrades, downgrades, and uninstallation.&lt;/li&gt;
&lt;li&gt;[[api-documentation:IConfigurablePlugin Plugin Type|IConfigurablePlugin]] enables plugins to expose configuration on the Manage Plugins page of the Control Panel.&lt;/li&gt;
&lt;li&gt;[[api-documentation:IRequiredConfigurationPlugin Plugin Type|IRequiredConfigurationPlugin]] ensures that a minimal amount of configuration information is provided by users before allowing the plugin to be enabled.&lt;/li&gt;
&lt;li&gt;[[api-documentation:IRenderableConfigurablePlugin Plugin Type|IRenderableConfigurablePlugin]] enables configurable plugins to render a custom configuration UI.&lt;/li&gt;
&lt;li&gt;[[api-documentation:IPluginGroup Plugin Type|IPluginGroup]] enables multiple dependent plugins to be enabled/disabled as a single unit.&lt;/li&gt;
&lt;li&gt;[[api-documentation:ITranslatablePlugin Plugin Type|ITranslatablePlugin]] enables plugins to manage translatable text resources.&lt;/li&gt;
&lt;li&gt;[[api-documentation:ITemplatablePlugin Plugin Type|ITemplatablePlugin]] enables text-based configuration to make use of editor-based templating.&lt;/li&gt;
&lt;li&gt;[[api-documentation:IScriptablePlugin Plugin Type|IScriptablePlugin]] enables plugins to define custom UI via widgets which can then optionally be edited within the platform widget editor.&lt;/li&gt;
&lt;li&gt;&lt;a href="/developers/w/developer90/50335/isingletonplugin-plugin-type"&gt;ISingletonPlugin &lt;/a&gt;forces only a single instance of the derived plugin type to be enabled at a time.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;&lt;a id="Learn_More_About_Plugins" name="Learn_More_About_Plugins"&gt;&lt;/a&gt;&lt;span style="font-weight:400;"&gt;Learn More About Plugins&lt;/span&gt;&lt;/h2&gt;
&lt;h3&gt;&lt;a id="Plugin_Lifecycle" name="Plugin_Lifecycle"&gt;&lt;/a&gt;&lt;span style="font-weight:400;"&gt;[[Plugin Lifecycle]]&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="font-weight:400;"&gt;Learn about the [[Plugin Lifecycle|plugin lifecycle]].&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;a id="Plugin_Examples" name="Plugin_Examples"&gt;&lt;/a&gt;&lt;span style="font-weight:400;"&gt;[[Plugin Examples]]&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="font-weight:400;"&gt;Review [[Plugin Examples|plugin examples]] to learn more about plugin implementation and specific plugin types.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;a id="Exceptions_and_Logging" name="Exceptions_and_Logging"&gt;&lt;/a&gt;&lt;span style="font-weight:400;"&gt;[[Exceptions and Logging]]&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="font-weight:400;"&gt;Plugins can utilize Telligent Community&amp;#39;s exception rendering and logging capabilities to simplify error and process logging.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;a id="api-documentation_Plugin_API_DocumentationPlugin_API_Documentation" name="api-documentation_Plugin_API_DocumentationPlugin_API_Documentation"&gt;&lt;/a&gt;[[api-documentation:Plugin API Documentation|Plugin API Documentation]]&lt;/h3&gt;
&lt;p&gt;&lt;span style="font-weight:400;"&gt;View the [[api-documentation:Plugin API Documentation|Plugin API Documentation]] for the complete list of platform plugin types.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;a id="api-documentation_In-Process_API_DocumentationIn-Process_API_Documentation" name="api-documentation_In-Process_API_DocumentationIn-Process_API_Documentation"&gt;&lt;/a&gt;[[api-documentation:In-Process API Documentation|In-Process API Documentation]]&lt;/h3&gt;
&lt;p&gt;&lt;span style="font-weight:400;"&gt;Plugins primarily interact with the Telligent Community platform using the&amp;nbsp;[[api-documentation:In-Process API Documentation|In-Process API]].&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;div style="font-size: 90%;"&gt;Tags: plugins, best practices&lt;/div&gt;
</description></item><item><title>Plugins</title><link>https://community.telligent.com/community/11/w/developer-training/65096/plugins/revision/1</link><pubDate>Thu, 13 Jun 2019 19:28:16 GMT</pubDate><guid isPermaLink="false">4371f751-7ed3-44be-8e55-fd8a4bdfee6a</guid><dc:creator>Ben Tiedt</dc:creator><comments>https://community.telligent.com/community/11/w/developer-training/65096/plugins#comments</comments><description>Revision 1 posted to Developer Training by Ben Tiedt on 06/13/2019 19:28:16&lt;br /&gt;
&lt;p&gt;[[api-documentation:IPlugin Plugin Type|Plugins]] are .net-based classes implementing [[api-documentation:IPlugin Plugin Type|IPlugin]]. Plugins are used to interact with Telligent Community&amp;#39;s&amp;nbsp;[[api-documentation:In-Process API Documentation|in-process API]]&amp;nbsp;by being installed directly within each web- and job-scheduler- node running the Telligent Community platform.&lt;/p&gt;
&lt;p&gt;&lt;a href="/cfs-file/__key/communityserver-wikis-components-files/00-00-00-12-83/Plugins-and-Framework.png"&gt;&lt;img src="/resized-image/__size/1040x0/__key/communityserver-wikis-components-files/00-00-00-12-83/Plugins-and-Framework.png" alt=" " /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[[api-documentation:IPlugin Plugin Type|IPlugin]] is the base interface for all [[api-documentation:Plugin API Documentation|plugins]]. Additional, special-use plugin types extend &lt;code&gt;IPlugin&lt;/code&gt; to provide access to use-case-specific functionality and provide a tighter integration with components of Telligent Community. For example, the [[api-documentation:IActivityStoryType Plugin Type|IActivityStoryType plugin interface]] extends &lt;code&gt;IPlugin&lt;/code&gt; to provide support for extending the Telligent Community&amp;nbsp;activity stream.&lt;/p&gt;
&lt;p&gt;The [[api-documentation:PluginManager In-Process API Service|plugin manager]] both manages the [[Plugin Lifecycle|lifecycle]] of plugins and provides access for retrieving instances of specific plugin types.&lt;/p&gt;
&lt;p&gt;[toc]&lt;/p&gt;
&lt;h2&gt;&lt;a name="Getting_started"&gt;&lt;/a&gt;Getting started&lt;/h2&gt;
&lt;p&gt;Plugins are .net classes implementing one or more [[api-documentation:Plugin API Documentation|plugin interfaces]]. To create a new plugin:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;[[Setting Up Your Development Environment|Set up your development environment]] for Telligent Community.&lt;/li&gt;
&lt;li&gt;Create a new .net class library project in Visual Studio using .net 4.x.&lt;/li&gt;
&lt;li&gt;Add a reference to the Telligent Community&amp;nbsp;assembly identified in the documentation associated to the [[api-documentation:Plugin API Documentation|plugin]] you want to implement. For example, to implement [[api-documentation:IPlugin Plugin Type|IPlugin]], a reference to Telligent.Evolution.Components.dll is required.&lt;/li&gt;
&lt;li&gt;Create a new public class in your class library project.&lt;/li&gt;
&lt;li&gt;Implement the plugin type. For example, the following class would implement IPlugin:&lt;br /&gt;&lt;pre class="ui-code" data-mode="csharp"&gt;using System;

namespace Samples
{
        public class MyPlugin : Telligent.Evolution.Extensibility.Version1.IPlugin
        {
        }
}&lt;/pre&gt;&lt;br /&gt;Right-click the IPlugin reference in the code and select &amp;quot;Implement Interface&amp;quot; and Visual Studio will stub out the implementation of the plugin type. For example, the code above, once stubbed out, results in:&lt;br /&gt;&lt;pre class="ui-code" data-mode="csharp"&gt;using System;

namespace Samples
{
	public class MyPlugin : Telligent.Evolution.Extensibility.Version1.IPlugin
	{
		#region IPlugin Members

		public string Name
		{
			get { throw new NotImplementedException(); }
		}

		public string Description
		{
			get { throw new NotImplementedException(); }
		}

		public void Initialize()
		{
			throw new NotImplementedException();
		}

		#endregion
	}
}&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;Update the plugin&amp;#39;s &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;Name&lt;/span&gt; and &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;Description&lt;/span&gt;. These properties are read to identify this plugin within the administration UI (where plugins are categorized, enabled, and configured).&lt;/li&gt;
&lt;li&gt;Implement the members defined by the plugin type. This is what defines what your plugin does. For example, it may attach an event handler to an event exposed by the [[api-documentation:In-Process API Documentation|In-process API]] and perform an action when that event occurs.&lt;/li&gt;
&lt;li&gt;Build the solution.&lt;/li&gt;
&lt;li&gt;Copy the resulting assembly (Samples.dll for example) into the web/bin/ folder of each&amp;nbsp;Telligent Community&amp;nbsp;web node and&amp;nbsp;job scheduler instance.&lt;/li&gt;
&lt;li&gt;As an administrator, go to &lt;strong&gt;Administration&lt;/strong&gt;, browse the existing categories or search for your plugin, enable the plugin, and save the changes.&lt;/li&gt;
&lt;li&gt;Your plugin is now running within Telligent Community.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;&lt;a name="Best_practices"&gt;&lt;/a&gt;Best practices&lt;/h2&gt;
&lt;p&gt;There are a few best practices to keep in mind when developing plugins:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ensure that the plugin class is publicly accessible.&lt;/li&gt;
&lt;li&gt;Either don&amp;#39;t define an explicit constructor or ensure that a public, parameterless constructor exists. The public, parameterless constructor is the one used by the plugin manager to instantiate your plugin.&lt;/li&gt;
&lt;li&gt;Register event handlers within the &lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt;Initialize()&lt;/span&gt; method only.&lt;/li&gt;
&lt;li&gt;Do not attach to any resources (database, file system, etc.) until the plugin&amp;#39;s&lt;span style="font-family:&amp;#39;courier new&amp;#39;, courier;"&gt; Initialize()&lt;/span&gt; method has been called.&lt;/li&gt;
&lt;li&gt;Implement more than one plugin interface with a single plugin class. Plugin types are all interfaces to enable implementing many interfaces with a single concrete class.&lt;/li&gt;
&lt;li&gt;Make use of other base plugin types when needed:
&lt;ol&gt;
&lt;li&gt;[[api-documentation:IInstallablePlugin Plugin Type|IInstallablePlugin]] enables plugins to implement their own installation lifecycle with support for installation, upgrades, downgrades, and uninstallation.&lt;/li&gt;
&lt;li&gt;[[api-documentation:IConfigurablePlugin Plugin Type|IConfigurablePlugin]] enables plugins to expose configuration on the Manage Plugins page of the Control Panel.&lt;/li&gt;
&lt;li&gt;[[api-documentation:IRequiredConfigurationPlugin Plugin Type|IRequiredConfigurationPlugin]] ensures that a minimal amount of configuration information is provided by users before allowing the plugin to be enabled.&lt;/li&gt;
&lt;li&gt;[[api-documentation:IRenderableConfigurablePlugin Plugin Type|IRenderableConfigurablePlugin]] enables configurable plugins to render a custom configuration UI.&lt;/li&gt;
&lt;li&gt;[[api-documentation:IPluginGroup Plugin Type|IPluginGroup]] enables multiple dependent plugins to be enabled/disabled as a single unit.&lt;/li&gt;
&lt;li&gt;[[api-documentation:ITranslatablePlugin Plugin Type|ITranslatablePlugin]] enables plugins to manage translatable text resources.&lt;/li&gt;
&lt;li&gt;[[api-documentation:ITemplatablePlugin Plugin Type|ITemplatablePlugin]] enables text-based configuration to make use of editor-based templating.&lt;/li&gt;
&lt;li&gt;[[api-documentation:IScriptablePlugin Plugin Type|IScriptablePlugin]] enables plugins to define custom UI via widgets which can then optionally be edited within the platform widget editor.&lt;/li&gt;
&lt;li&gt;&lt;a href="/developers/w/developer90/50335/isingletonplugin-plugin-type"&gt;ISingletonPlugin &lt;/a&gt;forces only a single instance of the derived plugin type to be enabled at a time.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;&lt;a id="Learn_More_About_Plugins" name="Learn_More_About_Plugins"&gt;&lt;/a&gt;&lt;span style="font-weight:400;"&gt;Learn More About Plugins&lt;/span&gt;&lt;/h2&gt;
&lt;h3&gt;&lt;a id="Plugin_Lifecycle" name="Plugin_Lifecycle"&gt;&lt;/a&gt;&lt;span style="font-weight:400;"&gt;[[Plugin Lifecycle]]&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="font-weight:400;"&gt;Learn about the [[Plugin Lifecycle|plugin lifecycle]].&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;a id="Plugin_Examples" name="Plugin_Examples"&gt;&lt;/a&gt;&lt;span style="font-weight:400;"&gt;[[Plugin Examples]]&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="font-weight:400;"&gt;Review [[Plugin Examples|plugin examples]] to learn more about plugin implementation and specific plugin types.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;a id="Exceptions_and_Logging" name="Exceptions_and_Logging"&gt;&lt;/a&gt;&lt;span style="font-weight:400;"&gt;[[Exceptions and Logging]]&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style="font-weight:400;"&gt;Plugins can utilize Telligent Community&amp;#39;s exception rendering and logging capabilities to simplify error and process logging.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;a id="api-documentation_Plugin_API_DocumentationPlugin_API_Documentation" name="api-documentation_Plugin_API_DocumentationPlugin_API_Documentation"&gt;&lt;/a&gt;[[api-documentation:Plugin API Documentation|Plugin API Documentation]]&lt;/h3&gt;
&lt;p&gt;&lt;span style="font-weight:400;"&gt;View the [[api-documentation:Plugin API Documentation|Plugin API Documentation]] for the complete list of platform plugin types.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;a id="api-documentation_In-Process_API_DocumentationIn-Process_API_Documentation" name="api-documentation_In-Process_API_DocumentationIn-Process_API_Documentation"&gt;&lt;/a&gt;[[api-documentation:In-Process API Documentation|In-Process API Documentation]]&lt;/h3&gt;
&lt;p&gt;&lt;span style="font-weight:400;"&gt;Plugins primarily interact with the Telligent Community platform using the&amp;nbsp;[[api-documentation:In-Process API Documentation|In-Process API]].&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;
</description></item></channel></rss>