【问题标题】:Service fabric actor interfaces服务结构参与者接口
【发布时间】:2016-06-12 11:26:57
【问题描述】:
是否可以让actor只包含属性?
我想创建一个actor,用于设置和获取属性。例如:
我有一个类似的界面,
public interface IData1 : IActor
{
string Classification { get; set; }
List<string> Tokens { get; set; }
}
我正在尝试使用以下代码创建一个演员代理对象:
var proxy = ActorProxy.Create<IData1>(ActorId.NewId(), "fabric:/Item");
我收到一条错误消息:
Microsoft.ServiceFabric.Actors.dll 中发生类型为“System.ArgumentException”的未处理异常。附加信息:参与者接口“Item.IData1”的方法“get_Classification”不返回任务或任务。 Actor 接口方法必须是异步的,并且必须返回 Task 或 Task。
【问题讨论】:
标签:
azure-service-fabric
stateful-actor-service
【解决方案1】:
根据定义,Actor 只允许相互传递消息。这只能通过暴露在他们的actor接口中的公共异步方法来完成。
如果您想将一个参与者状态的属性公开给另一个参与者或客户端,那么您必须创建像这样的显式异步 get/set 方法。
public interface IMyActor : IActor{
Task<int> GetMyProperty();
Task SetMyProperty(int value);
}
public class MyActor : StatefulActor<MyActor.ActorState>, IMyActor{
// This class represents the actors state
internal sealed class ActorState{
public int MyProperty {get; set;}
}
protected override Task OnActivateAsync()
{
State = new ActorState();
return base.OnActivateAsync();
}
public Task<int> GetMyProperty()
{
return Task.FromResult(State.MyProperty);
}
public Task SetMyProperty(int value)
{
State.MyProperty = value;
return Task.CompletedTask;
}
}
在参与者实现中声明 ActorState 并将其标记为 sealed 和 internal 强制执行仅允许此参与者访问该特定状态的想法。