2016-02-29 83 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強制執行,只有這個演員被允許訪問特定狀態的想法。