使用.NET Core 2.0 Controller中的DbContext调用非静态方法

时间:2018-01-29 09:47:04

标签: c# .net entity-framework

我创建了以下帮助器方法,该方法使用构造函数来检索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;
        }
    }
}

CreateAzureClient本质上是一个db调用,用于从Azure检索我的个人订阅和租户信息。它返回一个IAzure类型。

我想让他们从我的Controller中调用这个非静态方法。我无法在方法上使用构造函数,因为这会导致以下错误:

  

InvalidOperationException:无法解析类型&#39; AzureSdkExamples.Helpers.ComputeHelpers&#39;尝试激活AzureSdkExamples.Controllers.VirtualMachinesController&#39;。

调用辅助方法时,这是我的控制器:

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);
        }
    }
}

我实际上有点不知所措,主要是因为我自己误解了如何以正确的方式正确地链接这些构造函数/方法。

我试图采用最佳方法来避免多用户环境中潜在的内存泄漏。

考虑到在帮助程序中使用DI,如何从控制器正确调用此辅助方法?

1 个答案:

答案 0 :(得分:1)

您应该在DI容器中注册ComputeHelpers

您可以在Startup方法的ConfigureServices课程中执行此操作,例如与AddTransient

services.AddTransient<ComputeHelpers, ComputeHelpers>();

有关ASP.NET Core中的依赖注入的详细信息,请参阅the documentation