/// <summary> /// Write sensordata for all temperature-sensors to the diagnostics-logger. /// </summary> public void WriteAllTemperatureSensorsDataToLog(DiagnosticsLogger diagnosticsLogger) // -- target for method injection - but how do we feel about that...? { IEnumerable <TemperatureSensor> temperaturesSensors = Sensors.Where(sensor => sensor is TemperatureSensor).Cast <TemperatureSensor>(); temperaturesSensors.AsParallel().ForAll(temperatureSensor => { string logMessage = $"Sensor {temperatureSensor.Id} reported value {temperatureSensor.GetTemperature().ToString("N2")}"; diagnosticsLogger.WriteToLog(logMessage); }); }
/// <summary> /// A better design is to give the SensorCabinet the sensors it needs, in its constructor. /// We're also using method injection to inject the logger needed for the WriteAllTemperatureSensorsDataToLog() method. /// </summary> public static void Main() { // "Composition root" InitializaAlarms(); InitializeSensors(); AttachAlarmsToSensors(); IEnumerable <ISensor> sensorCollection = new List <ISensor>() { _temperatureSensor1, _temperatureSensor2, _pressureSensor }; SensorCabinet sensorCabinet = new SensorCabinet(sensorCollection); // now do some monitoring... // At some point, we wish to write temperature sensor values to a log. DiagnosticsLogger diagnosticsLogger = new DiagnosticsLogger(); sensorCabinet.WriteAllTemperatureSensorsDataToLog(diagnosticsLogger); // 'method injection' // Assuming we can't yank the logging-responsibility out of the sensor-cabinet class, method injection will have to do. // Introduce fluid interface pattern towards this purpose. }