private static ClassDeclarationSyntax GenerateReadGrain(ClassDeclarationSyntax grainClass, ITypeSymbol swmrInterface, int readReplicaCount) { string readGrainName = SwmrUtils.GetReadInterfaceName(grainClass.Identifier.Text); string readerInterfaceName = SwmrUtils.GetReadInterfaceName(swmrInterface.Name); ClassDeclarationSyntax readGrain = GenerateClassSqueleton(readGrainName).WithAttributeLists(AttributeUtils.AttributeListList(AttributeUtils.Attribute(StatelessWorkerAttributeName))).WithBaseList(RoslynUtils.BaseList(new[] { "Grain", readerInterfaceName })); readGrain = RoslynUtils.AddField(readGrain, "ITopology<string>", "_topology"); readGrain = readGrain.AddMembers(GenerateOnActivateAsyncMethod(readReplicaCount)); string readReplicaInterfaceName = SwmrUtils.GetReadReplicaInterfaceName(swmrInterface.Name); foreach (ISymbol member in swmrInterface.GetMembers()) { IMethodSymbol methodSymbol = member as IMethodSymbol; if (methodSymbol == null || !IsReadOnlyMethod(methodSymbol)) { continue; } MethodInspector methodInspector = new MethodInspector(methodSymbol); string parameters = "string sessionId"; if (methodInspector.MethodParams.Any()) { parameters = string.Join(", ", methodInspector.MethodParams.Select(param => string.Format("{0} {1}", param.Value, param.Key))) + " ," + parameters; } var method = RoslynUtils.ParseMethod(string.Format( @" public {0} {1}({2}) {{ string sessionNode = _topology.GetNode(sessionId); var readReplica = GrainFactory.GetGrain<{3}>(sessionNode); return readReplica.{1}({4}); }}", methodInspector.ReturnType, methodInspector.MethodName, parameters, readReplicaInterfaceName, string.Join(", ", methodInspector.MethodParams.Keys))); readGrain = readGrain.AddMembers( method.WithLeadingTrivia(SF.EndOfLine(""))); } return(readGrain); }