ict-architecture

Labo 07: Microkernel Architectuur

Implementatie van een plugin-systeem in C# voor een TextCell spreadsheetapplicatie.

Compileren & Uitvoeren

dotnet build
Compileer de C# applicatie.
dotnet run
Start de applicatie op.

Bestanden & Configuraties

IPlugin.cs
csharp
using System.Collections.Generic;
public interface IPlugin
{
string Name { get; }
BerekendeCel Execute(List<BerekendeCel> args);
}
De interface waaraan alle plugins moeten voldoen.
MinPlugin.cs
csharp
using System;
using System.Collections.Generic;
public class MinPlugin : IPlugin
{
public string Name => "min";
public BerekendeCel Execute(List<BerekendeCel> args)
{
if (args.Count == 0) return new BerekendeCel("Fout: Geen argumenten", CelType.ERROR);
int minWaarde = int.MaxValue;
foreach (var arg in args)
{
if (arg.CelType != CelType.INT) return new BerekendeCel($"Fout: geen getal.", CelType.ERROR);
int val = Convert.ToInt32(arg.VoorstellingWaarde);
if (val < minWaarde) minWaarde = val;
}
return new BerekendeCel(minWaarde.ToString(), CelType.INT);
}
}
Een implementatie van de IPlugin interface voor een 'min' functie.
Program.cs (Snippet)
csharp
using System.Reflection;
public static List<IPlugin> LoadPlugins(string path)
{
var plugins = new List<IPlugin>();
if (!Directory.Exists(path)) return plugins;
foreach (var file in Directory.GetFiles(path, "*.dll"))
{
var assembly = Assembly.LoadFrom(file);
var types = assembly.GetTypes().Where(t => typeof(IPlugin).IsAssignableFrom(t) && !t.IsInterface && !t.IsAbstract);
foreach (var type in types)
{
if (Activator.CreateInstance(type) as IPlugin is IPlugin plugin) plugins.Add(plugin);
}
}
return plugins;
}
Code om plugins dynamisch in te laden via Reflection.