在奥尔良创建同名流和谷物
Create stream and grain with the same name in Orleans
我有一个使用字符串键的谷物。我希望这个 grain 引用同名的流。
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
将 grain 与流连接时,我得到了这个 因为 grain 使用字符串作为键,而不是 GUID。同时,似乎 Orleans 中的流只能由 GUID 引用。因此,无法使用相同的名称调用 grain 和相关流。
问题
如何使用相同的名称连接 grain 和流?换句话说,无论grain被激活或停用多少次,我都想获得对同一个流的引用。
目前看来 Orleans 中的流只能通过 GUID 引用。 Orleans 团队提到在下一个版本中可能会添加为流指定字符串名称的功能。现在,这里是将字符串粒度名称与流的 GUID 匹配的 hacky 方法。
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();
}
欢迎提出更好的建议。
我有一个使用字符串键的谷物。我希望这个 grain 引用同名的流。
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
将 grain 与流连接时,我得到了这个
问题
如何使用相同的名称连接 grain 和流?换句话说,无论grain被激活或停用多少次,我都想获得对同一个流的引用。
目前看来 Orleans 中的流只能通过 GUID 引用。 Orleans 团队提到在下一个版本中可能会添加为流指定字符串名称的功能。现在,这里是将字符串粒度名称与流的 GUID 匹配的 hacky 方法。
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();
}
欢迎提出更好的建议。