如何在不参考 grain 实现的情况下调用 Orleans grain 方法?
How call Orleans grain method without reference of grain implementation?
如何在不引用grain实现的情况下调用Orleans grain方法?
- Grain 客户端 - .Net Core 应用程序。
- Grain 实现 class - classic .Net Framework 库,无法添加到 .Net Core 应用程序。
从客户端项目仅参考接口项目(核心 -> 标准)。
从宿主项目引用实现项目(完整 -> 完整),实现项目引用接口项目(完整 -> 标准)。
奥尔良最小样本
服务器
.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);
}
}
如何在不引用grain实现的情况下调用Orleans grain方法?
- Grain 客户端 - .Net Core 应用程序。
- Grain 实现 class - classic .Net Framework 库,无法添加到 .Net Core 应用程序。
从客户端项目仅参考接口项目(核心 -> 标准)。
从宿主项目引用实现项目(完整 -> 完整),实现项目引用接口项目(完整 -> 标准)。
奥尔良最小样本
服务器
.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);
}
}