0

是否有可能有一个只包含属性的演员?

我想创建一个用于设置和获取属性的演员。例如:我有一个类似的界面,

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<>。

4

1 回答 1

3

根据定义,参与者只允许相互传递消息。这只能通过在其参与者接口中公开的公共异步方法来完成。

如果您想将一个参与者状态的属性公开给另一个参与者或客户端,那么您必须创建像这样的显式异步 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并标记它sealedinternal强制执行仅允许此参与者访问该特定状态的想法。

于 2016-03-01T22:12:39.167 回答