If you have been following my Aurelia posts using an ASP.NET 5 web API then you will have noticed that I have been hardcoding the API url. In this post I am going to cover the basics of configuration in Aurelia which will allow the API url to be in a single location instead of spread all over the application.
Configuration will be done using the Aurelia-Configuration plugin. To install open a console window and navigate to the folder that contains the application’s package.json file and run the following command.
jspm install aurelia-configuration
If you are using Visual Studio to find your package.json make sure to click the show all files button in the solution explorer. With the release of RC1 package.json is hidden by default.
First code change is in the html file that kicks off Aurelia. The changed part is on the first line with aurelia-app which changed to aurelia-app=”main”.
<div aurelia-app="main"> <script src="../jspm_packages/system.js"></script> <script src="../config.js"></script> <script> System.import("aurelia-bootstrapper"); </script> </div>
Next add a main.js file in the wwwroot folder. This file will be called when Aurelia is bootstrapped and will control how Aurelia is bootstrapped. Everything in this file is the default Aurelia bootstrapping process other than “.plugin(‘aurelia-configuration’)” which is the part that needs to be added for configuration to work.
export function configure(aurelia) { aurelia.use .standardConfiguration() .developmentLogging() .plugin('aurelia-configuration'); aurelia.start().then(a => a.setRoot()); }
By default the configuration plugin looks for an application.json inside of a config directory in the root directory. This tripped me up a bit as I was expecting this to be a config directory inside of wwwroot, but that is not exactly the case. Root in the case means root for the Aurelia application context. In my case my Aurelia app is launched from a HomeController which means the application.json file needed to be in wwwroot/Home/config. Here is my application.json file with the base url for my test API.
{ "api": { "baseUrl": "http://localhost:18907/api/" } }
Now to get access to the configuration information. First add an import for configuration.
import {Configure} from 'aurelia-configuration';
Add Configure to the inject decorator.
@inject(HttpClient, Router, EventAggregator, Configure)
And to the constructor.
constructor(http, router, eventAggregator, configAurelia)
Now the actual usage of a config value with a before and after for comparison.
Before: .withBaseUrl('https://localhost:18907/api/'); After: .withBaseUrl(config.get('api.baseUrl'));
Here is all of the above together for reference.
import {Configure} from 'aurelia-configuration'; @inject(HttpClient, Router, EventAggregator, Configure) export class Detail{ constructor(http, router, eventAggregator, configAurelia){ http.configure(config => { config .useStandardConfiguration() .withBaseUrl(configAurelia.get('api.baseUrl')); }); this.http = http; this.router = router; this.eventAggregator = eventAggregator; }
That is all there is for basic configuration with Aurelia. Check out the plugin’s site for examples of how set up configurations for different environments, setting the config directory as well as filename.
Dear, this plugin has never worked for me.
It does not recognised the injected configAurelia object passed via the constructor.
Any chance that you have a example that I use to verify that is working.
Thanks.
George sorry to say that I don’t have a working example of this. I will add an update of this concept to my list of things to work on and will make sure to upload an example to github this round.
Do you have an example of this working with webpack? I’m using the “dotnet new aurelia” template and can’t get this plugin to work.
I can tell webpack is adding the json file contents as a module to app.js, but I’m unable to get aurelia-configuration pointed at it. I keep getting “Uncaught (in promise) Configuration file could not be found: config/config.json”.
ClientApp/
boot.ts (aurelia configure() that adds the plugin)
config/
config.json
Unfortunately, I haven’t used this plugin with webpack. I would love to hear what the solution was if you find one. I will add this to the lists of things to check out, but my guess is you will have it solved before I do.