【问题标题】: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 并将其标记为 sealedinternal 强制执行仅允许此参与者访问该特定状态的想法。

    【讨论】:

      猜你喜欢
      • 2018-04-11
      • 2017-12-08
      • 2017-07-09
      • 2017-03-12
      • 2016-06-17
      • 2018-03-06
      • 2015-08-03
      • 2020-04-11
      • 2018-05-18
      相关资源
      最近更新 更多