After playing around with MVC on .net core a little i realized I needed to have some maps functionality using static bing maps on my site. So after getting a key and reading through some documentation I found out that i needed to set the license key in the map url like this: “https://dev.virtualearth.net/REST/v1/Imagery/Map/AerialWithLabels/eiffel%20tower?mapSize=500,400&key=[YOUR_KEY_HERE]”.

I knew that I could use the dependency injection available to inject the configuration and key in all my models however this seemed cumbersome and a lot of work for something so simple. I knew there had to be a better way for this.After looking around I discovered a really nice and clean solution for my problem which I’ll explain down here.

The first thing we need is a settings class:

Appsettings.cs

This is our storage class for our Appsettings which in this example will have one value.

public interface IAppSettings
{
    string MapsKey { get; set; }
}
public class AppSettings : IAppSettings
{
    public string MapsKey { get; set; }

    public AppSettings(string mapsKey)
    {
        MapsKey = mapsKey;
    }
}

After finishing that I needed to wire up the Dependency Injection so that it will provide me with an instance when I need it. To do that add the following to startup.cs

Startup.cs

services.AddSingleton<IAppSettings>(new AppSettings(Configuration["BingMaps:Key"]));

This registers the dependency as a singleton and passes the settings from the appsettings.json to this class. But now I needed a way to get it injected into the razor page.

Index.cshtml

To allow the settings to be injected in the view you need to add the @inject to its razor page as you can see below:

@using MyProject.Settings
@inject IAppSettings AppSettings;

After you finished this you can then use this like any normal razor variable and append the key to the url like this:

<img src="https://dev.virtualearth.net/REST/v1/Imagery/Map/AerialWithLabels/eiffel%20tower?mapSize=500,400&[email protected]"/>

 

Leave a Reply

Your email address will not be published. Required fields are marked *