Recently, I developed a new application in the form of an automated task that pushed data via an HTTP Post an external API and then processed the data that was return so that it could be entered back in to an internal system. This project was broken up in to several components but the primary focus was on a managing component that spawned off requests to a worker component that basically encapsulated and each individual process away from the primary controlling component. I broke this application up in to the two main components so that I could have a better separation of concerns and this architecture allowed for more of a fault tolerant system because errors found in each individual request were suppressed to the managing component so that if a request returned back bad data then the request would still have the opportunity to process. Additionally, the main managing process handles the spinning off of requests as well as obtaining the list of items to be requested. If any errors were found in this layer of the application then no processing would occur in till all of the errors were eliminated during the management process.
Additional common components were created to allow for encapsulating data via Data Transfer Objects, accessing and manipulating data via Data Access Layer, and generic common component that allowed for code the be used amongst all of the other components.
For this basic application my thought process was to keep everything very simple and try to design the application so that it closely followed Uncle Bob’s Solid principles.