OverviewAt it's core, QBO3 is intended to enable business "power users" to create new functionality without going through the traditional software development life cycle. QBO3 comes pre-packaged with a database including many generic tables, including:
Each of these tables has a corresponding URL, or handler:
These handlers typically expect to be passed more information than just their base URL. For example:
These URLs can be thought of as method signatures: {ClassName}/{Operation}?{Parameters} The operations listed above ( Save, Email, Generate ) are build-in operations available in all QBO3 installations. A key goal of QBO3 was was enable power users to create entirely new Operations, without recompiling software. There are several ways do accomplish this, the most common being adding a new Statement. For example, let's assume a power user wants to get a list of all Contacts who have not yet been sent an email from QBO3. The URL they wish to use is Contact/Contact.ashx/ContactsMissingEmails . To accomplish this:
The power user has just added a new operations ( ContactMissingEmails ) to the QBO3 system.QBO3 Method SignaturesWhen the URL Contact/Contact.ashx/ContactMissingEmails is invoked, the following happens:
The implication here is that there is no C# method called ContactMissingEmails . The list of statements available to the Contact module is maintained in memory in the QBO3 application domain (and updated continuously via configuration monitoring).Note that the 'hard work' here is not done by the Contact.ashx handler; instead it's done by the ContactObject class. (Technically, it's done by a base class called AbstractObject .) This means that the work may be done not just by calling URLs, but by anything that can instantiate a ContactObject class. This is critical to understand. The queuing, workflow and import modules are 'smart' enough to invoke the same method signatures. For example:
QBO3 vs. MVCWhen designing QBO3, we considered building on top of Microsoft's MVC framework. In 2013, Microsoft's MVC framework did not easily allow extending MVC routes without recompiling the software. Since the power-user created statements are not known in advance, using MVC was problematic. Thus, we essentially re-invented our own data-driven route handling. QBO4 will leverage much of the route handling available in AspNet.Core's MVC framework. QBO3 vs. QBO2QBO2 was extremely capable. QBO3 is at least equally capable, but vastly simpler to configure. Key differences include:
|