/// <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);
            });
        }
Пример #2
0
        /// <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.
        }