ASP.NET 核心项目中的奥尔良直接客户
Orleans direct client in ASP.NET Core project
我目前正在研究奥尔良作为 Asp.net 核心网络 api 项目的后端,并且想知道是否有人对它的新功能 - "direct client" 有任何经验。 orleans 文档说“它允许以一种方式共同托管客户端和筒仓,让客户端不仅与它所连接的筒仓,而且与整个集群进行更有效的通信”,并且我知道你可以编写这样的代码(它在控制台应用程序中工作得很好):
var silo = new SiloHostBuilder()
.UseLocalhostClustering()
.EnableDirectClient()
.Build();
await silo.StartAsync();
var client = silo.Services.GetRequiredService<IClusterClient>();
我正在努力找出将这种类型的代码放在 asp.net 项目中的什么位置,该项目在 "Main" 中有自己的虚拟主机构建器(它应该转到 Startup class在 "ConfigureServices"?)。最后,我们的目标是单独的 client/server 设置,但为了加快开发速度,使用简单的设置会很有用,直接客户端似乎允许这样做。任何指向包含具有 asp.net 核心的直接客户端的资源 and/or 示例解决方案的指针都将不胜感激。谢谢。
编辑:这是现在对我有用的代码,但我对 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
和 Mediatr
的注册放在 StartUp
class 中,grain 代码会失败,并出现异常,指示无法实例化所需的依赖项。也许我在设置 Webhost
?
时做错了什么
对于 ASP.NET 2.x & Orleans 2.3 以下,我建议在 Web 主机之前创建和启动筒仓。配置 Web 主机时,从筒仓中注入 IGrainFactory
& IClusterClient
实例(通过 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();
我目前正在研究奥尔良作为 Asp.net 核心网络 api 项目的后端,并且想知道是否有人对它的新功能 - "direct client" 有任何经验。 orleans 文档说“它允许以一种方式共同托管客户端和筒仓,让客户端不仅与它所连接的筒仓,而且与整个集群进行更有效的通信”,并且我知道你可以编写这样的代码(它在控制台应用程序中工作得很好):
var silo = new SiloHostBuilder()
.UseLocalhostClustering()
.EnableDirectClient()
.Build();
await silo.StartAsync();
var client = silo.Services.GetRequiredService<IClusterClient>();
我正在努力找出将这种类型的代码放在 asp.net 项目中的什么位置,该项目在 "Main" 中有自己的虚拟主机构建器(它应该转到 Startup class在 "ConfigureServices"?)。最后,我们的目标是单独的 client/server 设置,但为了加快开发速度,使用简单的设置会很有用,直接客户端似乎允许这样做。任何指向包含具有 asp.net 核心的直接客户端的资源 and/or 示例解决方案的指针都将不胜感激。谢谢。
编辑:这是现在对我有用的代码,但我对 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
和 Mediatr
的注册放在 StartUp
class 中,grain 代码会失败,并出现异常,指示无法实例化所需的依赖项。也许我在设置 Webhost
?
对于 ASP.NET 2.x & Orleans 2.3 以下,我建议在 Web 主机之前创建和启动筒仓。配置 Web 主机时,从筒仓中注入 IGrainFactory
& IClusterClient
实例(通过 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();