Bercovici Adrian
Bercovici Adrian

Reputation: 9370

Cannot find an implementation class for grain interface

I have 2 interfaces in my assembly , and 2 grains that implement them.

public interface IGrain1:IGrainWithIntegerKey { void SomeMethod(); }
public interface IGrain2:IGrainWithIntegerKey { void SomeOtherMethod(); }

public Grain1:IGrain1
{
   public void SomeMethod()
   {
        var grain2=this.GrainFactory.GetGrain<IGrain2>([somekey]);
   }
}

public Grain2:IGrain2
{
       void SomeOtherMethod(){}
}

This call to grain of type IGrain2 throws :

Cannot find an implementation class for grain interface: [path].IGrain2 . Make sure the grain assembly was correctly deployed and loaded in the silo.

I do not get why this exception happens , since both interfaces and grains are in the same assembly. Can anyone provide any idea ?

Upvotes: 1

Views: 1598

Answers (1)

Armend Ukehaxhaj
Armend Ukehaxhaj

Reputation: 657

There are two possible solutions for this case:

  1. Adding MSBuild package reference:
 <PackageReference Include="Microsoft.Orleans.CodeGenerator.MSBuild" Version="3.4.2">
    <PrivateAssets>all</PrivateAssets>
    <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
 </PackageReference>
  1. In your SiloBuilder in Startup you could use the ConfigureApplicationParts method to register the Assembly. This is not recommended but can be done like this:
siloBuilder.ConfigureApplicationParts((Action<IApplicationPartManager>)(parts =>
  {  
     parts.AddApplicationPart(typeof(SomeGrain).Assembly).WithReferences();
  }));

Upvotes: 1

Related Questions