服务结构actor接口

时间:2016-02-29 12:14:47

标签: azure-service-fabric stateful-actor-service

是否可以让一个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;。

1 个答案:

答案 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并将其标记为sealedinternal强制执行只允许此actor访问该特定状态的想法。