Разработка приложения Windows для поддержки состояний в дочерних формах MDI
Это довольно длинный пост, и я постараюсь объяснить, как работает приложение, которое я разработал, и хочу, чтобы вы помогли его расширить в будущем.
Мне нужно спроектировать приложение на базе Windows на C#, которое в основном отслеживает события из внешнего источника связи и отображает данные на графике. Приложение подписывается на события объектов связи и обновляет пользовательский интерфейс по мере появления событий данных. Графический компонент внутри этих классов мониторинга будет использовать данные в буферах коммуникационных данных для отображения данных в виде линейного графика.
Чтобы добиться этого, я создал класс Factory, который будет создавать конкретный класс мониторинга (CWindowFirst или CWindowSecond и т. Д.) На основе информации о модели, которую я предоставляю (тип модели устройства).
Эти классы реализуют стандартный контракт (IFactoryInterface) для операций инициализации, сбора данных и очистки. Поэтому в любой момент времени я могу создать конкретный класс и запустить операцию мониторинга, чтобы получить данные и заполнить график в процессе. Пока все хорошо, я могу отображать данные в виде графика для конкретного устройства. Также в данный момент я уничтожаю (удаляю) объект CWindowFirst всякий раз, когда основное приложение выбирает другое окно (т.е. CWindowSecond или CWindowThird).
Как говорится в "разработке ПО, единственной константой является изменение", возникло новое требование, в котором мне нужно дать пользователю возможность приостановить / остановить функцию для графика. I should be able to Pause the graph (ie pause the data communication) and go to main window play around and also should be able to open another window (CWindowSecond) play there around a bit with the graph again (should be able to pause the communication here as well). Come back to the first window CWindowFirst and resume the previously saved data communication.
Now comes the million $ question, how do I achieve or rather modify the existing design to implement the feature as described above.
I can think of the following implementation but I'm not sure if its really a pragmatic one.
On issue of Pause command I shall
- Stop the communication (unsubscribe communication event) on Pause.
- Save the state of the event data buffers and graph in a collection.
- Serialize the complete object to a file before exit.
- On return to the same form, I shall deserialize the object
- Get the event data buffer from the deserialized object
- Populate in the graph and enable the event handlers so that I continue to receive events from the communication layer.
Experts out there I need your assistance out here. Please guide / suggest improvements / share your idea
1 ответ
Как прокомментировал HansPassant, отделите данные (или контекст, или менеджера, что угодно) от представления. ИМХО, синглтон с инъекцией в конструктор контекста.
Пример с использованием неочищенного способа синглтона:
public class MonitoringContext {
public static MonitoringContext CurrentContext = new MonitoringContext();
// handle generating data
// handle populating data needed for graph
// handle other action from other forms as well
}
public class FormGraph : Form{
// default constructor if you do not have access to MDI
public FormGraph(){
this.context = MonitoringContext.CurrentContext;
}
public FormGraph(MonitoringContext context){
this.context = context;
}
MonitoringContext context;
// do whatever you want with context
}
public class FormOther : Form{
// default constructor if you do not have access to MDI
public FormOther(){
this.context = MonitoringContext.CurrentContext;
}
public FormOther(MonitoringContext context){
this.context = context;
}
MonitoringContext context;
// do whatever you want with context
// any changes reflected at the FormGraph
// because of same reference and mutability
}
Конечно, это предложенный подход со стороны, который не знает требования и текущую архитектуру глубоко и подробно. Любая корректировка должна быть сделана, чтобы выполнить требование.