Click here to Skip to main content
13,765,160 members

Dominic Burford - Professional Profile





Summary

Follow on Twitter LinkedIn      Blog RSS
6,476
Author
1,841
Authority
7,401
Debator
8
Editor
95
Enquirer
42
Organiser
2,293
Participant
I am a professional software engineer and architect with over eighteen years commercial development experience with a strong focus on the design and development of web and mobile applications.

I have experience of architecting scalable, distributed, high volume web applications that are accessible from multiple devices due to their responsive web design, including architecting enterprise service-oriented solutions. I have also developed enterprise mobile applications using Xamarin and Telerik Platform.

I have extensive experience using .NET, ASP.NET, Windows and Web Services, WCF, SQL Server, LINQ and other Microsoft technologies. I am also familiar with HTML, Bootstrap, Javascript (inc. JQuery and Node.js), CSS, XML, JSON, Apache Cordova, KendoUI and many other web and mobile related technologies.

I am enthusiastic about Continuous Integration, Continuous Delivery and Application Life-cycle Management having configured such environments using CruiseControl.NET, TeamCity and Team Foundation Services. I enjoy working in Agile and Test Driven Development (TDD) environments.

Outside of work I have two beautiful daughters. I enjoy cycling, running and taking the dog for long walks. I love listening to music and am a fan of Rush and the Red Hot Chilli Peppers to name a few.

 
Articles 13 (Prolific)
Tech Blogs 0
Messages 1,015 (Master)
Q&A Questions 0
Q&A Answers 26
Tips/Tricks 14
Reference 0
Comments 68

Reputation

For more information on Reputation please see the FAQ.

Privileges

Members need to achieve at least one of the given member levels in the given reputation categories in order to perform a given action. For example, to store personal files in your account area you will need to achieve Platinum level in either the Author or Authority category. The "If Owner" column means that owners of an item automatically have the privilege. The member types column lists member types who gain the privilege regardless of their reputation level.

ActionAuthorAuthorityDebatorEditorEnquirerOrganiserParticipantIf OwnerMember Types
Have no restrictions on voting frequencysilversilversilversilverAdmin
Bypass spam checks when posting contentsilversilversilversilversilversilversilverSitebuilder, Subeditor, Mentor, Protector, Editor, Staff, Admin
Store personal files in your account areaplatinumplatinumSitebuilder, Subeditor, Supporter, Editor, Staff
Have live hyperlinks in your profilebronzebronzebronzebronzebronzebronzesilverSubeditor, Protector, Editor, Staff, Admin
Have the ability to include a biography in your profilebronzebronzebronzebronzebronzebronzesilverSubeditor, Protector, Editor, Staff, Admin
Edit a Question in Q&AsilversilversilversilverYesSubeditor, Protector, Editor, Admin
Edit an Answer in Q&AsilversilversilversilverYesSubeditor, Protector, Editor, Admin
Delete a Question in Q&AYesSubeditor, Protector, Editor, Admin
Delete an Answer in Q&AYesSubeditor, Protector, Editor, Admin
Report an ArticlesilversilversilversilverSubeditor, Mentor, Protector, Editor, Staff, Admin
Approve/Disapprove a pending ArticlegoldgoldgoldgoldSubeditor, Mentor, Protector, Editor, Staff, Admin
Edit other members' articlesSubeditor, Protector, Editor, Admin
Create an article without requiring moderationplatinumSubeditor, Mentor, Protector, Editor, Staff, Admin
Approve/Disapprove a pending QuestionProtector, Admin
Approve/Disapprove a pending AnswerProtector, Admin
Report a forum messagesilversilverbronzeProtector, Editor, Admin
Approve/Disapprove a pending Forum MessageProtector, Admin
Create a new tagsilversilversilversilverAdmin
Modify a tagsilversilversilversilverAdmin

Actions with a green tick can be performed by this member.


 
GeneralConsuming a private nuget feed in an Azure DevOps build pipeline Pin
Dominic Burford2-Nov-18 7:55
professionalDominic Burford2-Nov-18 7:55 
GeneralBuild a Xamarin.Forms iOS mobile app using Azure DevOps Pin
Dominic Burford9-Oct-18 0:38
professionalDominic Burford9-Oct-18 0:38 
GeneralDeploy a Mobile app to Azure using Azure DevOps Pin
Dominic Burford21-Sep-18 6:30
professionalDominic Burford21-Sep-18 6:30 
GeneralSetting up my first build pipeline with Azure DevOps Pin
Dominic Burford19-Sep-18 5:06
professionalDominic Burford19-Sep-18 5:06 
GeneralChoosing a mobile application development platform Pin
Dominic Burford4-Sep-18 2:36
professionalDominic Burford4-Sep-18 2:36 
GeneralExecuting an AJAX request from an ASP.NET Core querystring parameter Pin
Dominic Burford20-Aug-18 6:05
professionalDominic Burford20-Aug-18 6:05 
GeneralBuilding a Document Manager with ASP.NET Core 2.1 Pin
Dominic Burford19-Aug-18 23:38
professionalDominic Burford19-Aug-18 23:38 
GeneralReducing the surface area of the client Pin
Dominic Burford26-Jul-18 22:32
professionalDominic Burford26-Jul-18 22:32 
I came across this design strategy many years ago when writing client APIs, but it's a strategy that is worth considering when designing any client API. It's one I have made extensive use of in our current suite of ASP.NET Web APIs.

The surface area is what the client interacts with when consuming an API. Reducing the surface area is therefore a strategy for reducing what the client needs to interact with. By reducing what the client needs to interact with, your API is simpler and easier to consume by client applications.

Let's say you have a fairly simple data-entry application that allows the client to add/update/get/delete items such as customers, orders and deliveries (basic CRUD functionality). If we wanted to develop a client API to implement this functionality, we quite reasonably do this by implementing a customer API, an order API and a delivery API. Nothing wrong with this approach. Let's say that six months later we have added more functionality. We can now add/update/get/delete stock, suppliers and materials. The number of APIs the client now needs to interact with has doubled. From the point-of-view of the client, the API is now getting increasingly more complex to use, as there are a greater number of APIs to learn and use.

But wait. Don't all those APIs do roughly the same sort of thing? They all provide the same CRUD functionality, just to different entities (customer, order, delivery, stock, supplier and material).

What if we condensed all those CRUD APIs for all those different entities into a single API. That would provide the same level of functionality to the client application, but would also be easier to learn and understand as they only require the one API to interact with.

This is the concept behind reducing the surface area of the client.

In a web application I have been developing, we have a very similar scenario. We have a data-entry web application that provides CRUD functionality to the user. All the functionality has been implemented using ASP.NET Web API. However, the web application only consumes a single API. All POST, PUT, GET and DELETE requests are reduced down to a single API that performs all operations across the entire web application. Not only that, but all the APIs work in the same, consistent manner.

For example, the POST controllers (API) work in the following manner. I pass a single string key on the querystring. This tells the API what type of data is being passed. In the request body is the data itself in JSON format (other formats are available).

Example values for the querystring key could be "addcustomer", "addorder", "addsupplier". Then in the body of the request would be the actual data that represented the entity (customer, order, supplier etc).

Here is example code from the POST request controller.
[HttpPost]
[EnableCors(origins: "*", headers: "*", methods: "*")]
public async Task<HttpResponseMessage> WebPostData(string formname, [FromBody] JToken postdata)
{
    //log the request
    base.LogMessage(string.Format(CultureInfo.InvariantCulture, "{0}.{1}", GetType().Name, "WebPostDataToServiceBus"));
    base.LogMessage($"Formname={formname}");

    //authenticate the request
    if (!base.IsRequestAuthenticated())
    {
        base.LogMessage("Request failed authentication");
        throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.Forbidden));
    }
    //add the request to the service bus for processing
    return await this.AddWebTaskToServiceBus(formname, postdata);
}
This same concept can be applied to PUT, GET and DELETE requests. As long as you have a string key parameter that determines the type of the data, then you are able to implement the appropriate logic to process it (e.g. if you know you are adding a new customer, then you de-serialise the customer data and pass it to the database, service bus etc).

This makes your API surface much smaller, which in turn makes them far easier to consume, learn and comprehend. Surely that's better for everyone.
"There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult." - C.A.R. Hoare

Home | LinkedIn | Google+ | Twitter

GeneralUnderstanding what you're doing Pin
Dominic Burford26-Jul-18 4:24
professionalDominic Burford26-Jul-18 4:24 
GeneralSetting environments in ASP.NET Core Pin
Dominic Burford16-Jul-18 22:29
professionalDominic Burford16-Jul-18 22:29 
GeneralCreating a zipped deployment for an ASP.NET Core web application Pin
Dominic Burford29-Jun-18 0:59
professionalDominic Burford29-Jun-18 0:59 
GeneralI’m turning into a Microsoft fanboy Pin
Dominic Burford8-Jun-18 6:45
professionalDominic Burford8-Jun-18 6:45 
GeneralAdding a confirmation dialog to an ASP.NET Core 2.0 form page handler Pin
Dominic Burford7-Jun-18 5:34
professionalDominic Burford7-Jun-18 5:34 
GeneralUploading a file in ASP.NET Core 2.0 Pin
Dominic Burford1-Jun-18 5:07
professionalDominic Burford1-Jun-18 5:07 
GeneralASP.NET Core 2.0 Razor Page Handlers Pin
Dominic Burford15-May-18 1:01
professionalDominic Burford15-May-18 1:01 
GeneralMocking the HttpContext Session object in ASP.NET Core 2.0 Pin
Dominic Burford30-Apr-18 5:31
professionalDominic Burford30-Apr-18 5:31 
GeneralUsing ViewComponents in ASP.NET Core 2.0 Pin
Dominic Burford16-Apr-18 23:49
professionalDominic Burford16-Apr-18 23:49 
GeneralWeb application metrics with Application Insight Part 2 Pin
Dominic Burford10-Apr-18 23:50
professionalDominic Burford10-Apr-18 23:50 
GeneralWriting flexible code in ASP.NET Core 2.0 Razor Pages Pin
Dominic Burford3-Apr-18 6:06
professionalDominic Burford3-Apr-18 6:06 
GeneralPerforming Code Coverage for .NET Core 2.0 applications Pin
Dominic Burford23-Mar-18 5:54
professionalDominic Burford23-Mar-18 5:54 
GeneralRe: Performing Code Coverage for .NET Core 2.0 applications Pin
Slacker00723-Mar-18 6:12
professionalSlacker00723-Mar-18 6:12 
GeneralRe: Performing Code Coverage for .NET Core 2.0 applications Pin
Dominic Burford23-Mar-18 6:15
professionalDominic Burford23-Mar-18 6:15 
GeneralBuilding ASP.NET Core 2.0 web applications Pin
Dominic Burford21-Mar-18 6:39
professionalDominic Burford21-Mar-18 6:39 
GeneralObtaining the authentication token returned from Azure AD B2C in ASP.NET Core 2.0 Pin
Dominic Burford16-Mar-18 3:03
professionalDominic Burford16-Mar-18 3:03 
GeneralVersioning a .NET Core 2.0 application Pin
Dominic Burford13-Mar-18 3:34
professionalDominic Burford13-Mar-18 3:34 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.


Advertise | Privacy | Cookies | Terms of Service
Web06-2016 | 2.8.181114.1 | Last Updated 14 Nov 2018
Copyright © CodeProject, 1999-2018
All Rights Reserved.
Layout: fixed | fluid