title: Hello World 示例应用

为了开始我们的Orleans之旅,首先打开IHelloGrain.cs,你会发现以下接口声明:

  1. public interface IHelloGrain : IGrainWithStringKey
  2. {
  3. Task<string> SayHello(string greeting);
  4. }

它定义了IHelloGrainGrain接口。 我们知道它是一个Grain接口,因为它实现了IGrainWithStringKey。 这意味着当我们想获得对实现了IHelloGrain的Grain的引用时,我们将使用一个字符串值来标识Grain实例。 在我们的例子中,正如你将要在后面的Program.cs中看到的,我们将使用字符串"friend"来标识我们希望与之通信的Grain,它也可以是任意字符串:

  1. var friend = grainFactory.GetGrain<IHelloGrain>("friend");

现在,打开HelloGrain.cs,我们将看到IHelloGrain接口的实现:

  1. public class HelloGrain : Grain, IHelloGrain
  2. {
  3. public Task<string> SayHello(string greeting) => Task.FromResult($"Hello, {greeting}!");
  4. }

我们知道HelloGrain是一个grain的实现,因为它继承了Grain基类。 该类是用来识别应用程序中的Grain类。

HelloGrain通过返回一个简单的字符串实现了IHelloGrain$"Hello, {greeting}"

打开Program.cs,看看Orleans是如何配置的:

  1. using var host = new HostBuilder()
  2. .UseOrleans(builder =>
  3. {
  4. builder.UseLocalhostClustering();
  5. })
  6. .Build();
  7. await host.StartAsync();
  8. // Get the grain factory
  9. var grainFactory = host.Services.GetRequiredService<IGrainFactory>();
  10. // Get a reference to the HelloGrain grain with the key "friend".
  11. var friend = grainFactory.GetGrain<IHelloGrain>("friend");
  12. // Call the grain and print the result to the console
  13. var result = await friend.SayHello("Good morning!");
  14. Console.WriteLine("\n\n{0}\n\n", result);
  15. Console.WriteLine("Orleans is running.\nPress Enter to terminate...");
  16. Console.ReadLine();
  17. Console.WriteLine("Orleans is stopping...");
  18. await host.StopAsync();

这个程序创建了一个新的HostBuilder,并通过调用UseOrleans扩展方法将Orleans加入其中。 在该调用中,它将Orleans配置为使用本地主机集群,这一般用于开发和测试场景。 然后程序启动主机,并从服务提供者那里获取IGrainFactory实例。 使用IGrainFactory,我们可以得到一个Grain的引用。 在本例中,我们想要一个对名为"friend"HelloGrain实例的引用,因此我们调用grainFactory.GetGrain<IHelloGrain>("friend")。 一旦我们有了一个引用,我们就可以使用它,调用friend.SayHello("Good morning!"),将结果打印到控制台。

是时候让这个示例运行起来了。通过在终端窗口执行以下命令来实现:

  1. dotnet run

You should see Hello, Good morning!! printed to the console. 你应该看到控制台里打印出Hello, Good morning!!

Orleans在我们第一次调用HelloGrain时(friend.SayHello(...))自动为我们实例化了"friend"的实例。 作为开发者,我们不需要管理这些Grain的生命期。Orleans在需要时激活它们,当它们变得空闲时,就会停用它们。