如何在不参考 grain 实现的情况下调用 Orleans grain 方法?

How call Orleans grain method without reference of grain implementation?

如何在不引用grain实现的情况下调用Orleans grain方法?

从客户端项目仅参考接口项目(核心 -> 标准)。

从宿主项目引用实现项目(完整 -> 完整),实现项目引用接口项目(完整 -> 标准)。

它就像一个魅力,见:https://github.com/lmagyar/SO_Question_50689964

奥尔良最小样本

服务器

.Net 框架控制台应用程序

Install-Package Microsoft.Orleans.Core.Abstractions
Install-Package Microsoft.Orleans.OrleansCodeGenerator.Build
Install-Package Microsoft.Orleans.Server

class Program
{
    static async Task Main(string[] args)
    {
        await StartSilo();
    }
    static async Task StartSilo()
    {
        using (var host = new SiloHostBuilder()
            .UseLocalhostClustering()
            //.ConfigureLogging(logging => logging.AddConsole())
            .ConfigureApplicationParts(parts => parts.AddApplicationPart(typeof(SampleGrain).Assembly).WithReferences())
            .Build())
        {
            await host.StartAsync();

            Console.WriteLine("Silo started. Press any key to terminate...");
            Console.ReadKey();
        }
    }


}

public class SampleGrain : Grain, ISample
{
    public Task<string> Ping(string message)
    {
        Console.WriteLine($"Pinged with '{message}'");
        return Task.FromResult($"Message '{message}' received");
    }
}

接口

.Net 标准 class 库

Install-Package Microsoft.Orleans.Core.Abstractions

public interface ISample : IGrainWithStringKey
{
    Task<string> Ping(string message);
}

客户

.Net Core 控制台应用程序

Install-Package Microsoft.Orleans.OrleansCodeGenerator.Build
Install-Package Microsoft.Orleans.Client

static async Task Main(string[] args)
{
    await PingSample();
}

static async Task PingSample()
{
    using (var client = new ClientBuilder()
        .UseLocalhostClustering()
        //.ConfigureLogging(logging => logging.AddConsole())
        .ConfigureApplicationParts(parts => parts.AddApplicationPart(typeof(ISample).Assembly).WithReferences())
        .Build())
    {
        await client.Connect();
        Console.WriteLine("Client successfully connected to silo host.");

        var sample = client.GetGrain<ISample>("one");

        var result = await sample.Ping("hello");
        Console.WriteLine(result);
    }

}

https://github.com/Serj-Tm/Orleans.MinimalSample