Um ein Handelssystem erweiterbar zu designen benötigt man einen leistungsfähigen Plugin Mechanismus der es erlaubt weitere Handelssystemlogik ins System einzuhängen und zu nutzen.
Vor einem Jahr hätte ich an dieser Stelle einen Artikel über Reflection gebracht. Aber die Welt hat sich weiter gedreht und Microsoft hat inzwischen MEF (Microsoft extensibility Framework) releast.
Der heutige Artikel gibt eine kurze Einführung wie ein Plugin Mechanismus mit MEF realisiert werden kann.
1. Fügen Sie Ihrem Projekt eine Referenz auf System.ComponentModel.Composition.dll hinzu
2. Definition des Interfaces für Handelssysteme
public interface ITradingSystem
{
void Start();
void Stop();
}
3. Initialisieren von MEF
Die Nachfolgende Klasse zeigt schematisch die Initialisierung einer Liste mit Handelssystemen. Dass die MEF Initialisierungslogik nicht in den Konstruktor sondern in einen Bootstrapper gehört versteht sich von selbst.
public class TradingSystems
{
public TradingSystems()
{
var container = new CompositionContainer(new DirectoryCatalog(@".\"));
container.ComposeParts(this);
}
[ImportMany]
public List<ITradingSystem> TradingSystemList { get; set; }
}
4. Implementierung von Plugins (Handelssystemen)
[Export(typeof(ITradingSystem))]
public class TradingSystemA : ITradingSystem
{
public void Start(){}
public void Stop(){}
}
[Export(typeof(ITradingSystem))]
public class TradingSystemB : ITradingSystem
{
public void Start(){}
public void Stop(){}
}
Der ganze Mechanismus ist recht simpel. Man defiert einen Katalog auf ein Verzeichnis. MEF sucht in diesem Verzeichnis alle Assemblies und alle Typen. Jede Klasse die mit dem Export Attribut dekoriert ist wird in den Katalog mit aufgenommen. Der einzige Stolperstein liegt darin, das Interface zu exportieren und nicht die konkrete Implementierung. Dies wird mit dem typeof Attribute erreicht.
An der Stelle, an welcher die Plugins benötigt werden, genügt eine Collection Property vom Typ des Interfaces dekoriert mit dem ImportMany Attribut. Die Liste wird automatisch von MEF mit Instanzen der im Katalog enthaltenen Typen instanziert und gefüllt.
