我目前正在研究Orleans作为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
和Mediatr
的注册放在StartUp
类中,则谷物代码将失败,并带有一个异常,指示无法实例化所需的依赖项。设置Webhost
时可能做错了吗?
答案 0 :(得分:4)
对于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();