【问题标题】:Orleans direct client in ASP.NET Core projectASP.NET Core 项目中的奥尔良直接客户端
【发布时间】:2019-03-05 20:33:37
【问题描述】:

我目前正在研究 Orleans 作为 Asp.net 核心 web api 项目的后端,并且想知道是否有人对其新功能“直接客户端”有任何经验。奥尔良文档说“它允许共同托管客户端和筒仓,让客户端不仅可以与它所连接的筒仓,而且与整个集群更有效地进行通信”,我知道你可以编写这样的代码(它在控制台应用程序中工作得很好):

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

await silo.StartAsync();

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

我正在努力找出将这种类型的代码放在“Main”中有自己的 webhost 构建器的 asp.net 项目中的位置(应该转到“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();
        }

如果我将DbContextMediatr 的注册放在StartUp 类中,grain 代码将失败,并出现异常,表明无法实例化所需的依赖项。也许我在设置Webhost 时做错了什么?

【问题讨论】:

    标签: orleans


    【解决方案1】:

    对于 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();
    

    对于 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();
    

    【讨论】:

    • 快速提问 - 在第一个示例中,我们使用ConfigureServices 扩展来注册IGrainFactoryIClusterClientStartup 类有自己的 ConfigureServices 方法,其中大部分容器配置是针对 ASP 代码进行的。我认为它们会是相加的(即不会相互冲突)?
    • 它们是相加的。启动类是静态的,所以我不能将任何状态传递给它。
    • 嗯,如果我尝试将应用程序的 DbContext 添加到 StratUp 类或直接添加到 WebHostBulder 上的 ConfigureServices,我最终会在 PMC 中收到 Unable to create an object of type 'UserDbSet'. For the different patterns supported at design time, see https://go.microsoft.com/fwlink/?linkid=851728 消息。在使用直接客户端添加筒仓代码之前,应用程序在创建迁移和/或更新数据库时没有问题。知道可能是什么问题吗?示例:services.AddDbContext&lt;UserDbSet&gt;(o =&gt; o.UseSqlite("Data Source=User.db"))
    • 更新:我能够通过在我的解决方案中添加 DesignTimeDbContextFactory : IDesignTimeDbContextFactory 类来解决这个特定问题
    • update2:此外,我必须在SiloBuilder 中配置我的DbContext,而不是在StartUp 类中,否则如果我尝试在grain 代码中注入DbContext,grain 激活会失败。看来silo和webhost不共享同一个服务容器。
    猜你喜欢
    • 2021-09-02
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多