I'm trying to design an application, something quite generic over a .NET C# Stack.
It's supposed to be an desktop application intended to control industrial equipment and to perform measurements and testing, however it's planned to be able to switch later on different UIs dealing with different
I'm trying to have a pretty generic approach:
- UI Agnostic: Webpages / Winforms / WPF / GTK# / Whathever, etc. using naked objects in order to avoid the hassles of a lot boiler-plate UI code.
- DB Agnostic for storing Data (ADO.NET & EF can deal with that)
- Remote Control and Monitoring (that's really tricky but I guess with WCF I should manage to have a remote access with service running on the remote client)
- User Management
- External Industrial Resources (devices)
- Logging and bug reporting
- Reporting and data exportation
The business layer of the application is split into three main parts and leveraging the other parts described above:
- Edition: define a set of tests (flowchart) with conditions (user interactions, results fetching during the tests) using the industrial resources available
- Operation: perform the tests defined above with user interaction (if any defined in during the previous step)
- Analysis: deal with the data (DB) that have been recorded accordingly to the test definition given in the edition part and provide some statistical computations: data mining features (clustering, anomaly detection, etc.) and reporting feature (that can also be defined to be generated automatically at different moment of the operation).
My problem is that I would like to have a modular approach and I'm wondering whether this is really desirable in my case. The approach is sound but at the same time it seems like providing a lot of issues.
Theoretically, it means you can test your modules independently from each others but actually in most cases even though you can mock the inputs / outputs required for the tests, the reality is still that it requires other dependencies to make it run and this is for me the real bottom line in this approach. The fact that you can load and unload some are for me only applicable in a couple of situations but not that many.
For instance, the User Management is using the Database Module which probably also going to use another enciphering module and so on and on and on.
Later on the remote control and monitoring would also eventually use that so... my point is that it seems pretty hard to have modules fully independent here.
The plugin / modular approach would work like a charm for external industrial resources where those devices would have to implement a certain interface to be compatible with the system.
But about the rest I'm really suspicious whether it worth the hassle of using MEF or any other plugin / extension framework.
What do you think? Is the modular approach really applicable to everything in my case? Or just a couple of features can take advantage of it.