/// <summary> /// Creates a new object of the specified type. /// This is important to use instead of the new operator, because this will invoke the required parameters /// for the DefaultWorker. /// </summary> /// <typeparam name="T">The type of IWorker</typeparam> /// <returns>The new IWorker object</returns> /// <exception cref="ArgumentException">If the specified type is not registered in the WorkerGroups</exception> public static T CreateWorker <T>() where T : IWorker { if (WorkerGroups.ObjectBindings.GetOrNothing(typeof(T), out var group)) { return(DefaultWorker.Instantiate <T>(@group, Guid.NewGuid())); } throw new ArgumentException("missing group for worker"); }
private void OnCellClick(object sender, DataGridViewCellEventArgs args) { if (args.RowIndex < 0) { return; } var current = overview.Rows[args.RowIndex]; var create = false; if (!(current.Cells[2].Value is IWorker worker)) { if (!DialogWorkerType(out var group, out var label)) { return; } if (!WorkerGroups.ObjectBindings.GetOrNothing(group, out var clazz)) { Logger.Warn("Unable to get class for group id {0}", group); return; } create = true; worker = DefaultWorker.Instantiate(clazz, group, label); } using (var parameters = new Parameters(worker)) { reopen: var result = parameters.ShowDialog(); switch (result) { case DialogResult.OK when create: { ShowWorker(worker); workers[worker.Label] = worker; break; } case DialogResult.No when !create: { SystemSounds.Exclamation.Play(); goto reopen; } } } }
/// <summary> /// Loads the IWorker objects from the configuration into the IDictionary. /// </summary> /// <param name="workers">The IDictionary to store the workers</param> /// <returns>true if the operation was successful otherwise false</returns> public bool Load(IDictionary <Guid, IWorker> workers) { if (!File.Exists(configuration)) { return(false); } try { using (var stream = new FileStream(configuration, FileMode.Open, FileAccess.Read)) { var reader = new BinaryReader(stream); var count = reader.ReadInt32(); for (var i = 0; i < count; i++) { var group = reader.ReadGuid(); var label = reader.ReadGuid(); if (!WorkerGroups.ObjectBindings.GetOrNothing(group, out var clazz)) { Logger.Warn("Can't find class binding for group id {0}", group); // ToDo: drain further stream continue; } var worker = DefaultWorker.Instantiate(clazz, group, label); var payloadAmount = reader.ReadInt32(); var payloadBuffer = reader.ReadBytes(payloadAmount); if (worker is DefaultWorker defaults) { using (var payload = new MemoryStream(payloadBuffer, false)) { try { defaults.LoadPreferences(payload); } catch (Exception ex) { Logger.Error("An error occurred while loading preferences for {0}", worker.GetType()); Logger.Debug("Exception: {0}", ex); } } } else { Logger.Warn("Cannot load preferences for non DefaultWorker"); Logger.Debug("Please note Worker must implement DefaultWorker to use preferences"); } workers[label] = worker; } } } catch (IOException) { Logger.Error("An unexpected io exception occurred while loading from file {0}", configuration); return(false); } return(true); }