是否可以让一个actor只包含属性?
我想创建一个用于设置和获取属性的actor。例如: 我有一个像
这样的界面public interface IData1 : IActor
{
string Classification { get; set; }
List<string> Tokens { get; set; }
}
我正在尝试使用以下代码创建一个actor代理对象:
var proxy = ActorProxy.Create<IData1>(ActorId.NewId(), "fabric:/Item");
我收到错误说:
未处理的类型&#39; System.ArgumentException&#39;发生在Microsoft.ServiceFabric.Actors.dll.Additional information:Method&#39; get_Classification&#39;演员界面&#39; Item.IData1&#39;不返回任务或任务&lt;&gt;。 actor接口方法必须是异步的,必须返回Task或Task&lt;&gt;。
答案 0 :(得分:3)
根据定义,演员只允许相互传递消息。这只能通过其actor接口中公开的公共异步方法来完成。
如果您希望将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;
}
}
在actor实现中声明ActorState
并将其标记为sealed
和internal
强制执行只允许此actor访问该特定状态的想法。