Orleans ASP.NET Core项目中的直接客户端

Mil*_*rim 4 orleans

我目前正在研究Orleans作为Asp.net核心Web api项目的后端,并且想知道是否有人对它的新功能-“直接客户端”有任何经验。奥尔良的文档说:“ 它允许以一种方式共同托管客户端和孤岛,从而使客户端不仅可以与其连接的孤岛,而且可以与整个集群进行更有效的通信 ”,我知道您可以编写类似这样的代码(并且在控制台应用中可以正常工作):

var silo = new SiloHostBuilder()
               .UseLocalhostClustering()
               .EnableDirectClient()
               .Build();

await silo.StartAsync();

var client = silo.Services.GetRequiredService<IClusterClient>();
Run Code Online (Sandbox Code Playgroud)

我正在努力找出将这种类型的代码放置在asp.net项目中的哪个位置,该项目在“ Main”中具有自己的webhost构建器(应该转到“ ConfigureServices”中的Startup类吗?)。最后,我们的目标是建立一个单独的客户端/服务器设置,但是为了加快开发速度,使用简单的设置(直接客户端似乎允许这样做)会很有用。包含具有asp.net核心的直接客户端的资源和/或示例解决方案的任何指针将不胜感激。谢谢。

编辑:这是现在对我有用的代码,但是我对他设置DI的方式不满意

var silo = new SiloHostBuilder()
               .UseLocalhostClustering()
               .EnableDirectClient()
               .Build();

await silo.StartAsync();

var client = silo.Services.GetRequiredService<IClusterClient>();
Run Code Online (Sandbox Code Playgroud)

如果我把登记DbContextMediatrStartUp类,谷物代码失败,并指示故障来实例化所需的依赖关系的异常。设置时我可能做错了Webhost什么?

Reu*_*ond 6

对于低于2.3的ASP.NET 2.x和Orleans,我建议在Web主机之前创建并启动筒仓。配置Web主机时,请从筒仓中注入IGrainFactoryIClusterClient实例(通过来获得silo.Services):

var silo = new SiloHostBuilder()
    .UseLocalhostClustering()
    .EnableDirectClient()
    .Build();

await silo.StartAsync();

var client = silo.Services.GetRequiredService<IClusterClient>();

var webHost = new WebHostBuilder()
    .ConfigureServices(services =>
        services
            .AddSingleton<IGrainFactory>(client)
            .AddSingleton<IClusterClient>(client))
    .UseStartup<Startup>()
    // Other ASP.NET configuration...
    .Build();
Run Code Online (Sandbox Code Playgroud)

对于ASP.NET 3.0和Orleans 2.3或更高版本,由于Microsoft.Extensions.Hosting在两个框架中都增加了支持,因此集成代码变得更加简单:

var host = new HostBuilder()
    .ConfigureWebHost(builder =>
    {
        // Adding IGrainFactory, etc, is not necessary, since Orleans 
        // and ASP.NET share the same dependency injection container.
        builder.UseStartup<Startup>();
    })
    .UseOrleans(builder =>
    {
        // EnableDirectClient is no longer needed as it is enabled by default
        builder.UseLocalhostClustering();
    })
    .Build();

await host.StartAsync();
Run Code Online (Sandbox Code Playgroud)