Announcing: Prise 1.6.0

Maarten Merken
3 min readApr 14, 2020

--

I’m thrilled to announce the latest stable version of Prise: 1.6.0

Prise [/Prease/] is a highly customizable and flexible plugin framework, written in .NET Core for any .NET Core app.

Prise’s main features include:

  • Easy setup
  • Eager and lazy loading of plugins
  • Supporting backwards compatibility using the Prise.Proxy (DispatchProxy)
  • Assembly scanning
  • Loading plugins over the network (http)
  • Support for .NET Core 2.1, 3.0 and 3.1 projects!

The example library has grown to 15 example applications using this latest version of Prise. Including an Azure Function, Avalonia application and an MVC application with API Controllers as plugins and MVC views as plugins.

Ensuring a more robust release, an accumulated amount of 780 integration tests are ran every commit to ensure nothing is broken with each code change using GitHub Actions.

During the latest refactoring-spree, Prise has been split up into these six packages:

Prise includes all the heavy-lifting of the plugin framework, including:

  • The plugin loader
  • The plugin options builder (for your Startup.cs)
  • Logging
  • Assembly selector
  • Assembly loader
  • Plugin Caching
  • Plugin instance creation (ProxyCreator)
  • Multi-platform support (Windows, Linux)
  • Assembly loading strategies
  • Native assembly loader
  • Plugin service provider
  • Unloading of plugin assemblies

For the curious, the main logic resides in the PluginLoader.

Prise.Mvc holds all the infrastructure in order to support loading MVC components as plugins (Razor views, API Controllers).

Prise.Proxy was created to encapsulate the DispatchProxy logic, this infrastructure makes the decoupled-aspect of Prise possible. By creating a separate package for this, it allows you to write Proxies of objects without bringing in the whole Prise infrastructure. To see this in action, look at its dedicated example project.

Prise.Plugin holds all the required attributes and interfaces you need to create your own plugins. These attributes allow the Prise infrastructure to discover and load your plugins correctly.

Prise.PluginBridge was created to have to Plugin reach back out into the Host application. I would’ve wanted to call this the Prise.ReverseProxy, but that would’ve caused too much confusion about what it actually tries to achieve. This package allows you to bridge the gap that was created by the Prise.Proxy, hence the name…

Prise.AssemblyScanning.Discovery adds assembly discovery to the Prise infrastructure. Prise allows for declarative static discovery of an assembly by default. This package replaces that functionality with a service that scans a particular directory (and subdirectories) for plugins.

Examples

An Avalonia app that holds 3 plugins inside 1 assembly.

Works on Ubuntu,

An ASP.NET Core MVC 3.1 application that allows you to globally enable/disable a plugin for your ASP.NET Core website.

More examples can be found in the Example repo

Getting started ? Check out the Simple Plugin example: https://github.com/merken/Prise.Examples/tree/master/SimplePlugin

Questions?

Please submit a GitHub issue: https://github.com/merken/Prise/issues

--

--