
Empinia is a component oriented, flexibly expandable software platform for .NET, written in C#. Our aim is to provide an Eclipse RCP for .NET - a base for new applications that saves developers a lot of effort.
Empinia has a pluggable architecture: a minimal core that can be enhanced by extensions. A compilation of interacting extensions make an application. The plugin infrastructure of Empinia manages most tasks you need for dealing with extensions. As such, it's quite easy to utilize.
As its heart, Empinia uses an IoC-container. We are currently using the Windsor container from the Castle Project. Around that container, a couple of core services are assembled. These services are the plugin infrastructure of Empinia. They are responsible for:
scanning for existing extensions in the file system
resolving and checking dependencies between extensions
loading of extensions
Some additional services ship with Empinia:
caching of arbitrary serializable objects
management of preferences
providing message dialogs
management of commands, triggered by actions
providing a context for a command that is run
Applications developed with Empinia have at least two layers: the base layer with the Empinia core and its services and the top layer. The top layer is where the domain logic of your application is implemented.
Extensions interact with each other. To allow for hooking, an extension can define extension-points where other extensions can wire with.
Extensions can be grouped in bundles. A bundle is a .NET assembly with an embedded XML-file bundle.xml. This file contains the description of the extensions, to which extension points they hook and which extension-points they provide.
When Empinia starts up, the application directory is scanned and all assemblies are checked if they contain a bundle.xml. If the content of the bundle.xml is consistent, all metainformation is loaded into a central extension registry. This registry is pivotal for requesting information about and invoking functionality of an extension. This registry is used by the IoC-container for loading and instantiation of extensions.
Empinia puts focus on the development of GUI-applications. It has a view-concept: you can define views, that are compilations of controls and windows that form a single user-interface. Single controls can be wired with actions that fire when an event of the control is triggered.