奥尔良在ASP.NET Core项目中指导客户端

问题描述 投票:1回答:1

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

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

await silo.StartAsync();

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

我正在努力想弄清楚将这种类型的代码放在一个asp.net项目中的位置,该项目在“Main”中有自己的webhost构建器(它应该转到“ConfigureServices”中的Startup类吗?)。最后,我们的目标是单独的客户端/服务器设置,但为了更快的开发,使用直接客户端似乎允许的简单设置将是有用的。任何指向包含带有asp.net核心的直接客户端的资源和/或示例解决方案的指针都将受到赞赏。谢谢。

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

public static async Task Main(string[] args)
        {

            var silo = new SiloHostBuilder()
                    .UseLocalhostClustering()
                    .ConfigureServices(services =>
                    {
                        services.AddDbContext<UserDbSet>(o =>  o.UseSqlite("Data Source=UserTest.db"));
                        services.AddMediatR(typeof(Startup).Assembly);
                    })
                    .EnableDirectClient()
                    .Build();

            await silo.StartAsync();

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

            await WebHost.CreateDefaultBuilder(args)
                        .UseConfiguration(new ConfigurationBuilder()
                            .AddCommandLine(args)
                            .Build())
                        .ConfigureServices(services =>
                            services
                             .AddSingleton<IGrainFactory>(client)
                             .AddSingleton<IClusterClient>(client))
                        .UseStartup<Startup>()
                        .Build()
                        .RunAsync();
        }

如果我在DbContext类中注册了MediatrStartUp,则谷物代码会失败并显示异常,表示无法实例化所需的依赖项。也许我在设置Webhost时做错了什么?

orleans
1个回答
6
投票

对于2.3以下的ASP.NET 2.x和Orleans,我建议在Web主机之前创建和启动silo。配置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();

对于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();
© www.soinside.com 2019 - 2024. All rights reserved.