2016-02-29 61 views
0

是否有可能只有属性的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'的异常。其他信息:actor接口'Item.IData1'的方法'get_Classification'不返回任务或任务<>。参与者接口方法必须是异步的,并且必须返回任务或任务<>。

回答

3

根据定义,参与者只能将消息传递给对方。这只能通过公开的演示界面中公开的异步方法来完成。

如果您想将actor状态的属性暴露给另一个actor或client,那么您必须创建像这样的显式异步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强制执行,只有这个演员被允许访问特定状态的想法。