Do you know how to manually resolve dependencies in .net core? Something like
DependencyResolver.Resolve<ISomeService>()
UPDATE I'm in a class that was not injected, I want to resolve it from the inside, rather than pass variables all over the place
In ASP.NET Core dependency injection, we usually register injectable dependencies at the start of our program. We can then resolve these dependencies (services) much later once when we need them. Sometimes, however, we may need to resolve those dependencies even before building our app.
to be able to resolve instances with ASP.NET Core DI in static classes, you need a full “service provider” that contains the services you already have added from your startup.cs class. Isn’t enough create a new instance of IServiceProvider and use it.
There's an easy way to resolve dependencies at runtime with our old friend, the factory pattern. Let's say we are writing a simple app to determine the weather for a location, determined by a postal code the user enters into a text box.
Does this answer your question? Resolving instances with ASP.NET Core DI from within ConfigureServices Just be aware that you're creating a maintenance nightmare, as you can no longer trust the dependencies injected via the constructor to be all the dependencies.
Add your dependency in ConfigureServices
as below
public void ConfigureServices(IServiceCollection services){
//AddSingleton or AddTransient based on your requirements
services.AddTransient<ISomeService, ConcreteService>();
}
In your controller or anywhere, add IServiceProvider
in the constructor like below:
using Microsoft.Extensions.DependencyInjection;
...
public class HomeController
{
...
public HomeController(IServiceProvider serviceProvider)
{
var service = serviceProvider.GetService<ISomeService>();
}
}
@Shazam, Here are some notes or suggestions based on your comment:
If you can not inject because you might not have a constructor in this class, I woud suggest to add a paramter to your function and pass the resolved dependency from outside
Another Idea is to add a static property and initialize its value in ConfigureServices
For Example:
public static class MyClass
{
public static ISomeService MyServiceObj { set; get; }
....
}
In your ConfigureServices
public void ConfigureServices(IServiceCollection services){
services.AddTransient<ISomeService, ConcreteService>();
MyClass.MyServiceObj = services.GetService<ISomeService>();
}
Hope this helps, please rate my answer or leave me a comment if you still in doubt how to do it
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With