Simplifying Dependency Injection in .NET
Tags: vonage, dotnet, sdk, dependencyinjection
Published: 2024-02-27 09:13:31

Hey there, fellow developers!

We've got some exciting news to share about our .NET SDK!
We've just rolled out a fantastic new feature that will make your lives much easier.
You know how initializing the client used to be a bit of a pain, right?
Well, fear no more!

Since version [v6.4.0](https://github.com/Vonage/vonage-dotnet-sdk/releases/tag/v6.4.0), we integrated a solution that takes the hassle out of the process.
Now, you can use a cool extension method to register our client in the ASP.NET default Dependency Injection container.
Intrigued? Keep reading to find out more!

## Standard Client Initialization

Imagine we'd like to use [Meetings API](https://developer.vonage.com/en/meetings/overview) features.
We would have to initialize an instance of the main client (`VonageClient`) to fetch the specific `MeetingsClient`.

```csharp
Credentials credentials = ...
VonageClient vonageClient = new VonageClient(credentials);
IMeetingsClient meetingsClient = vonageClient.MeetingsClient;
```

It's indeed quite straightforward as the client only expects a `Credentials` object to be created.
So far, nothing new; you've been there.

Even if it's relatively easy, it has a few downsides:
- You must create a `VonageClient` while you only need a `IMeetingsClient`
- You create unnecessary coupling to the `VonageClient` implementation, which makes your code harder to test

And there's more to it: if you want to inject any of our clients, you must register all of them in your container. Manually.  

There's definitely room for some improvement.

## Enters our DI Registration!

Okay, let's get to the good stuff!
With our new extension method, you no longer have to do that.

Check out how easy it is to use:

```csharp
using Microsoft.Extensions.DependencyInjection;
using Vonage;
using Vonage.Extensions;

// ...

public void ConfigureServices(IServiceCollection services)
{
    //...

    // Initialize credentials
    Credentials credentials = ...
    // Register our clients with a 'Transient' lifetime...
    services.AddVonageClientTransient(credentials);
    // Or a 'Scoped' lifetime
    services.AddVonageClientScoped(credentials);

    // ...
}
```

That's it!

It relies on [ASP.NET DI Container](https://learn.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection) from `Microsoft.Extensions.DependencyInjection`, which means it's compatible as long as you're handling an `IServiceCollection` instance. 
This is provided by default on ASP.NET WebApi and WebApp, but you can also integrate it with ConsoleApps and Services.

You can choose between two `ServiceLifetime` options:
- `Transient`: _objects are always different_  
- `Scoped`: _objects are the same for a given request but differ across each new request_

By calling `services.AddVonageClient{lifetime}`, you're telling the DI container set up the `VonageClient` for you.

You can now enjoy dependency resolution with the main client or any subclient:

```csharp
[ApiController]
[Route("[controller]")]
public class VonageController : ControllerBase
{
    ...

    public VonageController(VonageClient client) => this.client = client;
}

[ApiController]
[Route("[controller]")]
public class VonageController : ControllerBase
{
    ...

    public VonageController(IMeetingsClient client) => this.client = client;
}
```


## Wrapping Up

We're proud to make your developer journey smoother with new quality-of-life improvements.
It's never been easier to integrate our SDK into your .NET applications. 

And guess what? 
Your feedback and contributions matter to us!

So, feel free to hit up our GitHub repository to report issues, suggest improvements, or even contribute your pull requests.
If you have questions, join us on the [Vonage Developer Slack](https://developer.vonage.com/en/community/slack), and we will get back to you.

Happy coding, friends!