Azure 函数、依赖注入和循环
Azure Function, Dependency Injection and loop
我有以下代码:
Startup.cs:
services.AddTransient<ProcessPendingDeactivateDeviceStatus>();
函数代码:
public class FunctionPendingDeactivationStatusesCheck
{
private readonly IDeviceService _deviceService;
private readonly ProcessPendingDeactivateDeviceStatus _pendingDeviceStatus;
public FunctionPendingDeactivationStatusesCheck(
IDeviceService deviceService,
ProcessPendingDeactivateDeviceStatus pendingDeviceStatus)
{
_deviceService = deviceService;
_pendingDeviceStatus = pendingDeviceStatus;
}
[Singleton]
[FunctionName("FunctionPendingDeactivationStatusesCheck")]
public async Task Run([TimerTrigger("0 12,27,42,57 * * * *")] TimerInfo myTimer, ExecutionContext context, ILogger log)
{
var pendingDeletingDevices = _deviceService.GetDevicesByStatus(DeviceStatus.PendingDeleted);
foreach (var device in pendingDeletingDevices)
{
await _pendingDeviceStatus.InitAsync(device);
因此,正如我们所见,我们在循环内调用 InitAsync
并在所有迭代中使用相同的实例。
我想为每次迭代重新创建这个对象。怎么做?
需要工厂才能获得所需的行为。
注册将用于创建实例的工厂委托
services.AddTransient<ProcessPendingDeactivateDeviceStatus>();
services.AddSingleton<Func<ProcessPendingDeactivateDeviceStatus>>(sp =>
() => sp.GetRequiredService<ProcessPendingDeactivateDeviceStatus>()
);
注入工厂并根据需要创建实例
public class FunctionPendingDeactivationStatusesCheck {
private readonly IDeviceService _deviceService;
private readonly Func<ProcessPendingDeactivateDeviceStatus> factory;
public FunctionPendingDeactivationStatusesCheck(
IDeviceService deviceService,
Func<ProcessPendingDeactivateDeviceStatus> factory) {
_deviceService = deviceService;
this.factory = factory;
}
[Singleton]
[FunctionName("FunctionPendingDeactivationStatusesCheck")]
public async Task Run([TimerTrigger("0 12,27,42,57 * * * *")] TimerInfo myTimer, ExecutionContext context, ILogger log) {
var pendingDeletingDevices = _deviceService.GetDevicesByStatus(DeviceStatus.PendingDeleted);
foreach (var device in pendingDeletingDevices) {
ProcessPendingDeactivateDeviceStatus _pendingDeviceStatus = factory();
await _pendingDeviceStatus.InitAsync(device);
//...
每次调用factory
,容器都会创建一个新的瞬态实例。
没有关于为什么每次迭代都需要一个新实例的任何详细信息,就无法判断在有很多设备的情况下创建那么多实例是否会产生任何不利影响。
我有以下代码:
Startup.cs:
services.AddTransient<ProcessPendingDeactivateDeviceStatus>();
函数代码:
public class FunctionPendingDeactivationStatusesCheck
{
private readonly IDeviceService _deviceService;
private readonly ProcessPendingDeactivateDeviceStatus _pendingDeviceStatus;
public FunctionPendingDeactivationStatusesCheck(
IDeviceService deviceService,
ProcessPendingDeactivateDeviceStatus pendingDeviceStatus)
{
_deviceService = deviceService;
_pendingDeviceStatus = pendingDeviceStatus;
}
[Singleton]
[FunctionName("FunctionPendingDeactivationStatusesCheck")]
public async Task Run([TimerTrigger("0 12,27,42,57 * * * *")] TimerInfo myTimer, ExecutionContext context, ILogger log)
{
var pendingDeletingDevices = _deviceService.GetDevicesByStatus(DeviceStatus.PendingDeleted);
foreach (var device in pendingDeletingDevices)
{
await _pendingDeviceStatus.InitAsync(device);
因此,正如我们所见,我们在循环内调用 InitAsync
并在所有迭代中使用相同的实例。
我想为每次迭代重新创建这个对象。怎么做?
需要工厂才能获得所需的行为。
注册将用于创建实例的工厂委托
services.AddTransient<ProcessPendingDeactivateDeviceStatus>();
services.AddSingleton<Func<ProcessPendingDeactivateDeviceStatus>>(sp =>
() => sp.GetRequiredService<ProcessPendingDeactivateDeviceStatus>()
);
注入工厂并根据需要创建实例
public class FunctionPendingDeactivationStatusesCheck {
private readonly IDeviceService _deviceService;
private readonly Func<ProcessPendingDeactivateDeviceStatus> factory;
public FunctionPendingDeactivationStatusesCheck(
IDeviceService deviceService,
Func<ProcessPendingDeactivateDeviceStatus> factory) {
_deviceService = deviceService;
this.factory = factory;
}
[Singleton]
[FunctionName("FunctionPendingDeactivationStatusesCheck")]
public async Task Run([TimerTrigger("0 12,27,42,57 * * * *")] TimerInfo myTimer, ExecutionContext context, ILogger log) {
var pendingDeletingDevices = _deviceService.GetDevicesByStatus(DeviceStatus.PendingDeleted);
foreach (var device in pendingDeletingDevices) {
ProcessPendingDeactivateDeviceStatus _pendingDeviceStatus = factory();
await _pendingDeviceStatus.InitAsync(device);
//...
每次调用factory
,容器都会创建一个新的瞬态实例。
没有关于为什么每次迭代都需要一个新实例的任何详细信息,就无法判断在有很多设备的情况下创建那么多实例是否会产生任何不利影响。