我正在尝试使用这个库https://github.com/OrleansContrib/SignalR.Orleans将SignalR与MS Orleans背板一起使用 当我将.AddOrleans()添加到AddSignalR()时,就像自述文件中的指令一样,但它会在Configure中的UseSignalR()代码中导致此错误:
尝试激活'SignalR.Orleans.DefaultClusterClientProvider'时,无法解析类型'Orleans.IClusterClient'的服务。
ConfigureServices:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddSignalR().AddOrleans();
}
配置:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseAuthentication();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseSignalR(routes =>
{
routes.MapHub<Hubs.MainHub>("/main");
});// this code work if I remove AddOrleans in ConfigureServices
app.UseMvc();
}
在检查库代码时,AddOrleans函数代码是这样的:
public static ISignalRBuilder AddOrleans(this ISignalRBuilder builder, IClusterClientProvider clientProvider = null)
{
if (clientProvider != null)
builder.Services.AddSingleton(clientProvider);
else
builder.Services.TryAddSingleton<IClusterClientProvider, DefaultClusterClientProvider>();
builder.Services.AddSingleton(typeof(HubLifetimeManager<>), typeof(OrleansHubLifetimeManager<>));
return builder;
}
我仍然不知道为什么它不起作用,因为依赖注入对我来说有点新鲜。
DefaultClusterClientProvider
构造函数需要一个IClusterClient
实例。您收到的例外情况表明IClusterClient
实例未在DI容器中注册。
您发布的示例代码似乎不会实例化群集客户端。您可能需要添加如下内容:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddSignalR().AddOrleans();
var client = new ClientBuilder()
... // other client configuration options here
.UseSignalR()
.Build();
services.AddSingleton<IClusterClient>(client);
}
除了其他对象(如ASP.NET核心控制器)之外,单例注册应使集群客户端可用于DefaultClusterClientProvider
构造函数。