我有一个使用字符串键的颗粒。
public class StreamGrain : Grain, IGrainWithStringKey
{
protected IAsyncStream<IPointModel> _dataStream = null;
protected IAsyncStream<ITransactionModel> _actionStream = null;
public override Task OnActivateAsync()
{
var identity = this.GetPrimaryKey(); // this.GetPrimaryKeyString();
var streamProvider = GetStreamProvider("Inputs");
_dataStream = streamProvider.GetStream<IPointModel>(identity, "Points");
_actionStream = streamProvider.GetStream<ITransactionModel>(identity, "Transactions");
return base.OnActivateAsync();
}
}
同时,当我尝试使用GetPrimaryKey
将颗粒与流连接时,我得到这个错误,因为颗粒使用字符串作为键,而不是GUID。同时,Orleans中的流似乎只能通过GUID来引用。因此,无法使用相同的名称调用颗粒和相关流。
如何使用相同的名称连接一个grain和一个stream ?换句话说,无论一个颗粒被激活或取消激活了多少次,我都希望获得对同一流的引用。
目前看来,奥尔良的流只能通过GUID来引用。奥尔良团队提到,下一个版本可能会添加为流提供字符串名称的功能。现在,这里是匹配字符串粒度名称和流GUID的简单方法。
String => MD5 => GUID
public override Task OnActivateAsync()
{
using (var provider = MD5.Create())
{
var name = this.GetPrimaryKeyString();
var streamProvider = GetStreamProvider(nameof(NameEnum.Inputs));
var identity = new Guid(provider.ComputeHash(Encoding.ASCII.GetBytes(name)));
_dataStream = streamProvider.GetStream<IPointModel>(identity, nameof(NameEnum.Points));
_actionStream = streamProvider.GetStream<ITransactionModel>(identity, nameof(NameEnum.Transactions));
}
return base.OnActivateAsync();
}
请随意提出更好的建议。