In a previous post Blazor routing and Navigation we injected the NavigationManager into out page using the following
@inject NavigationManager NavManager
So when we use @inject followed by the type we want injected, ASP.NET/Blazor will automatically supply the NavigationManager (assuming one exists).
Adding services
Ofcourse we can also add our own types/services to the DI container.
On a Blazor WebAssembly application, we can add types to the Program.cs, Main method, for example
public static async Task Main(string[] args) { var builder = WebAssemblyHostBuilder.CreateDefault(args); // template generated code here // my custom DataService builder.Services.AddSingleton<IDataService, DataService>(); await builder.Build().RunAsync(); }
In Blazor Server, we add our types to the Startup.cs, ConfigureServices method, for example
public void ConfigureServices(IServiceCollection services) { // template generated code here // my custom DataService services.AddSingleton<IDataService, DataService>(); }
Service lifetime
In the examples in the previous section we added the service as a singleton.
- Scoped – this is means the service is scoped to the connection. This is the preferred way to handle per user services – there is no concept of scope services in WebAssembly as obviously it’s a client technology at this point and already per user scoped
If you need access to service is a Component class, i.e. you’re creating your own IComponent you have mark a property with the InjectAttribute
public class MyService { [Inject] IDataService DataService { get; set; } }
Ofcourse constructor injection (my preferred way to do things) is also available, so we just write code such as this, assuming that MyService is created using the service container
public class MyService
{
public MyService(IDataService dataService)
{
// do something with dataService
}
}