前言
第一弹说明了什么是Grain,感兴趣可以点击传送门!!这一弹主要讲讲如何去开发Grain,我也是顺着官网文档往下讲,如果有错的地方欢迎指正!!!
Grain返回值
Grain的返回值由Task, Task, ValueTask三种组成,具体返回方式如以下代码所示。
对于Task<T>类型,需要实际的去返回具体泛型
public Task<IGameGrain> GetCurrentGame()
{
return Task.FromResult(_game);
}
对于Task,类似返回Void类型的方法,也是需要默认返回Task.CompletedTask
public Task JoinGame(IGameGrain game)
{
_game = game;
Console.WriteLine($"Player {this.GetPrimaryKey()} joined the game");
return Task.CompletedTask;
}
对于标记了async的Task<T>方法, 直接返回Task<IGameGrain>
public async Task<IGameGrain> GetCurrentGame()
{
return await Task.FromResult<IGameGrain>(null);
}
对于标记了async的Task方法, 返回return就行
public async Task JoinGame(IGameGrain game)
{
return;
}
Grain引用创建
Grain是一个轻量级代理对象,通过# IGrainFactory.GetGrain创建,如果对象还存活则继续复用,我们使用时,无需关心它的物理位置,逻辑位置, 它会通过标识计算出该访问哪个机器的哪个Grain。
当Grain存在多个实现
我实现IUnionGrain
public class AUnionGrain : Grain, IUnionGrain
{
public Task JoinUnion(long playerId)
{
return Task.CompletedTask;
}
public Task LeaveUnion(long playerId)
{
return Task.CompletedTask;
}
}
我也实现IUnionGrain
public class BUnionGrain : Grain, IUnionGrain
{
public Task JoinUnion(long playerId)
{
return Task.CompletedTask;
}
public Task LeaveUnion(long playerId)
{
return Task.CompletedTask;
}
}
// Unable to identify a single appropriate grain type for interface ICounterGrain. Candidates: xxx, xxx
grainFactory.GetGrain<IUnionGrain>("史上最帅战队");
我脑裂啦,你到底是谁? AUnionGrain是"史上最帅战队"还是 BUnionGrain???
解决方案
1.通过Grain前缀消除定义 IUnionGrain AUnionGrain = grainFactory.GetGrain("史上最帅战队", grainClassNamePrefix: "A"); IUnionGrain BUnionGrain = grainFactory.GetGrain("史上最帅战队", grainClassNamePrefix: "B");
2.通过属性指定默认颗粒度类型
[DefaultGrainType("UnionGrainA")]
public interface IUnionGrain : IGrainWithGuidKey
{
/// <summary>
/// 加入战队
/// </summary>
/// <param name="playerId">玩家Id</param>
/// <returns></returns>
public Task JoinUnion(long playerId);
/// <summary>
/// 离开战队
/// </summary>
/// <param name="playerId">玩家Id</param>
/// <returns></returns>
public Task LeaveUnion(long playerId);
}
[GrainType("UnionGrainA")]
public class UnionGrainA : Grain, IUnionGrain
{
public Task JoinUnion(long playerId)
{
return Task.CompletedTask;
}
public Task LeaveUnion(long playerId)
{
return Task.CompletedTask;
}
}
[GrainType(UnionGrainB)]
public class UnionGrainB : Grain, IUnionGrain
{
public Task JoinUnion(long playerId)
{
return Task.CompletedTask;
}
public Task LeaveUnion(long playerId)
{
return Task.CompletedTask;
}
}
[GrainType("")] 指定类型 [DefaultGrainType("")] 冲突时默认类型 可以通过指定类型获取, 如果没有指定类型就按默认的走 IUnionGrain AUnionGrain = grainFactory.GetGrain(GrainId, "UnionGrainA"));