如何在Azure中使用http函数获得持久实体的状态?



我是Azure函数和持久实体的新手。我试图做一个小的演示项目,这是建立一个实体,并使用http函数来获得实体的状态。但是当我试图访问那个实体时,它一直显示& null";

下面是我的代码:

\bedManager.cs
namespace HospitelBedManager
{
public static class BedManager
{
[FunctionName(nameof(AssignBed))]
public static async Task<IActionResult> AssignBed(
[HttpTrigger(AuthorizationLevel.Function, "get")]
HttpRequest req,
[DurableClient] IDurableEntityClient durableEntityClient,
ILogger log)
{
var bedNumber = req.Query["bedNumber"];
var entityId = new EntityId(nameof(BedEntity),bedNumber);

var bedEntity = await durableEntityClient.ReadEntityStateAsync<BedEntity>(entityId);

await durableEntityClient.SignalEntityAsync(entityId, nameof(BedEntity.AssignBedAsync));
Console.WriteLine("***" + bedEntity.EntityExists + "***");
return new OkObjectResult($"Bed {bedNumber} has been set to occupied.");
}
}
}
Bedentity.cs
namespace HospitelBedManager.Entities
{
public class BedEntity
{
public string BedNumber { get; set; }
public bool IsOccupied { get; set; }

private readonly ILogger _logger;
public BedEntity(ILogger logger, string bedNumber)
{
_logger = logger;
BedNumber = bedNumber;
}

[FunctionName(nameof(BedEntity))]
public static async Task HandleEntityOperation(
[EntityTrigger] IDurableEntityContext context,
ILogger logger)
{
await context.DispatchAsync<BedEntity>(logger, context.EntityKey);
}

public Task<bool> IsOccupiedBedAsync()
{
var IsOccupied = BedNumber == "123";
return Task.FromResult(IsOccupied);
}

public Task AssignBedAsync(string bedNumber)
{
IsOccupied = true;
return Task.CompletedTask;
}
}
}

谢谢你的帮助!

我不完全确定这种东西是否非常适合持久实体,尽管您说这只是一个示例。然而,持久实体更适合于状态机或断路器之类的东西。它们不能很好地替代数据库。已经说过,当您的函数第一次运行床号时,没有床实体状态可读,您将获得null。也就是说,在你展示的代码中,你没有在任何地方初始化床实体。

如果您可以将床视为状态机,那么初始状态可能是未占用/可用的。一旦预订,它将转换为不可用状态。

最新更新