public void Initialize() { var extensionTypes = ExtensionList.GetExtensionInterfaces(); IDbSet <SarUnit> units = this.db.Units; int unitCount = 0; try { unitCount = units.Local.Count; } catch (InvalidOperationException) { this.log.Error("Can't initialize database, does it need to be set up?"); } if (unitCount == 0) { return; } foreach (var unit in units) { string assemblyName = string.Format("{0}.Extensions", unit.DisplayName); if (!File.Exists(Path.Combine(Path.GetDirectoryName(new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath), assemblyName + ".dll"))) { log.InfoFormat("Unit {0} has no extension DLL", unit.DisplayName); continue; } var assembly = Assembly.Load(assemblyName); extensions.Add(unit.Id, new Dictionary <Type, Type>()); foreach (var type in extensionTypes) { Type implementation = assembly.ExportedTypes.SingleOrDefault(f => type.IsAssignableFrom(f)); if (implementation == null) { continue; } extensions[unit.Id].Add(type, implementation); log.InfoFormat("{0} added extension {1} for interface {2}", unit.DisplayName, implementation.Name, type.Name); } } }