Plato is a modern, extensible web application written in C# and built upon .NET core, MVC & Bootstrap. Plato is written entirely from scratch to minimise external dependencies and ensure clean, consistent code throughout.
Whenever possible we leverage existing paradigms or best practices already defined by Microsoft and offered by .NET core to ensure we don't reinvent the wheel and ensure Plato is both secure and familiar for .NET Core developers.
Plato leverages the constructor dependency injection pattern offered out of the box by .NET core throughout. Plato is completed coded against abstract interfaces making it super easy to swap out any functionality offered by Plato with your own concrete implementation.
Plato leverages the built in identity services and authentication abstractions provided by .NET Core for user authentication and account recovery.
Plato leverages the built in authorization and permission abstractions provided by .NET Core to control access to resources or features within Plato.
Plato leverages the localization abstractions provided by .NET Core to support localization of all text presented within Plato. Plato is only provided with our en-US language files however Plato can be localized to your language.
Plato uses regular MVC 6 included within .NET Core for all view composition. As you would expect you can wrap your design around Plato via a familiar _layout.cshtml file or include razor code within any Plato view. Plato views are just regular cshtml MVC files.
Whilst single page applications are very popular and can offer a nice user experience we didn't feel this was the right approach for Plato. We really didn't want to add a dependency on a SPA framework as these are often very large and change on a daily basis.
Instead for Plato we've developed our own hybrid rendering approach. To minimise progress bars, page flashes or spiny icons all initial page loads within Plato are rendered entirely on the server. After the initial page load any further content that may need to be added to the page is still rendered on the server however the HTML generated by the server is simply injected into the page via a light-weight client side XmlHttp request.
This approach has the following benefits...