Reputation: 1481
I've created the following helper method which uses a constructor to retrieve the DbContext.
namespace AzureSdkExamples.Helpers
{
public class ComputeHelpers
{
private readonly ApplicationDbContext _dbContext;
public ComputeHelpers(ApplicationDbContext db)
{
_dbContext = db;
}
public async Task<List<VirtualMachine>> GetClientVirtualMachines(int customerId)
{
var azureClient = _dbContext.CreateAzureClient(customerId);
var virtualMachines = await azureClient.VirtualMachines.ListAsync();
List<VirtualMachine> virtualMachineObjects = new List<VirtualMachine>();
int vmCount = 0;
foreach (var virtualMachine in virtualMachines)
{
virtualMachineObjects.Add(
new VirtualMachine
{
Id = vmCount,
VirtualMachineName = virtualMachine.ComputerName,
AzureVmId = virtualMachine.VMId
}
);
vmCount++;
}
return virtualMachineObjects;
}
}
}
The CreateAzureClient is essentially a db call to retrieve my personal subscriptions and tenant information from Azure. It returns an IAzure type.
I want to them call this non-static method from my Controller. I can't use a constructor on the method as this results in the following error:
InvalidOperationException: Unable to resolve service for type 'AzureSdkExamples.Helpers.ComputeHelpers' while attempting to activate 'AzureSdkExamples.Controllers.VirtualMachinesController'.
This is my controller when calling the helper method:
namespace AzureSdkExamples.Controllers
{
[Route("api/[controller]")]
public class VirtualMachinesController : Controller
{
private readonly ComputeHelpers _computeHelper;
public VirtualMachinesController(ComputeHelpers computeHelpers)
{
_computeHelper = computeHelpers;
}
[HttpGet("{id}", Name = "GetAllVirtualMachines")]
public async Task<JsonResult> GetAllVirtualMachines(int customerId)
{
var virtualMachines = await _computeHelper.GetClientVirtualMachines(customerId);
return Json(virtualMachines);
}
}
}
I'm actually at a bit of a loss on what to do, mainly due to my own misunderstanding of how to appropriately chain these constructors/methods the correct way.
I'm trying to take the best approach to avoid potential memory leaks in a multi-user context.
How do I correctly call this helper method from the controller considering the use of DI in the helper?
Upvotes: 0
Views: 889
Reputation: 174397
You should register ComputeHelpers
in the DI container.
You can do that in the Startup
class in the ConfigureServices
method, e.g. with AddTransient
:
services.AddTransient<ComputeHelpers, ComputeHelpers>();
See the documentation for more details about the Dependency Injection in ASP.NET Core
Upvotes: 1