orleans
orleans copied to clipboard
`IGrainReferenceActivatorProvider` exception with interfaces written in F#
I've checked out the F# sample app and found out that interfaces in that sample app are written in C#.
Since there's not much point in using F# while being restricted to C# types (one can't use F# types in C# interfaces), I rewrote that assembly in F#.
IHelloGrain.fs
namespace HelloWorldInterfaces
open System.Threading.Tasks
open Orleans
type IHelloGrain =
inherit IGrainWithIntegerKey
abstract member SayHello : message:string -> ValueTask<string>
HelloWorldInterfaces.fsproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<Compile Include="IHelloGrain.fs" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Orleans.Sdk" Version="8.0.0" />
</ItemGroup>
</Project>
Problem is that after applying the above change (and fixing reference paths from .csproj to .fsproj), now I'm getting:
Unhandled exception. System.InvalidOperationException: Unable to find an IGrainReferenceActivatorProvider for grain type hello
at Orleans.GrainReferences.GrainReferenceActivator.CreateActivator(GrainType grainType, GrainInterfaceType interfaceType) in /_/src/Orleans.Core/GrainReferences/GrainReferenceActivator.cs:line 85
at Orleans.GrainReferences.GrainReferenceActivator.CreateReference(GrainId grainId, GrainInterfaceType interfaceType) in /_/src/Orleans.Core/GrainReferences/GrainReferenceActivator.cs:line 54
at Orleans.GrainFactory.GetGrain(Type interfaceType, IdSpan grainKey, String grainClassNamePrefix) in /_/src/Orleans.Core/Core/GrainFactory.cs:line 217
at Orleans.GrainFactory.GetGrain[TGrainInterface](Int64 primaryKey, String grainClassNamePrefix) in /_/src/Orleans.Core/Core/GrainFactory.cs:line 51
at Program.<Main>$(String[] args) in /home/peter/work/org/dotnet-samples/orleans/FSharpHelloWorld/HelloWorld/Program.cs:line 21
at Program.<Main>(String[] args)
How can I fix the above problem?
How can I declare interfaces with F# types in Orleans project?
I've added a commit for the above change to make it easier to test:
https://github.com/dotnet/samples/commit/c132eb845fd7ccfd3f487dbd89fb5fafff071c10
isn't that by design? If i remember correctly, orleans source generator only works on c# projects. The way we do it is we have a c# project that references the f# one and the sdk, and has a c# file with something like this
[assembly: GenerateCodeForDeclaringAssembly(typeof(Any type from the f# project with grain interfaces))]
@pkese what @mikescandy wrote is right. The missing line is likely [assembly: GenerateCodeForDeclaringAssembly(typeof(HelloWorldInterfaces.IHelloGrain))]
For reference: https://github.com/dotnet/orleans/issues/8312#issuecomment-1618953015