SignalR.Orleans вызывает ошибку в app.UseSignalR - PullRequest
2 голосов
/ 10 марта 2019

Я пытаюсь использовать SignalR с объединительной платой MS Orleans, используя эту библиотеку https://github.com/OrleansContrib/SignalR.Orleans
Когда я добавил .AddOrleans () в AddSignalR (), как инструкция в файле readme, но это вызывает эту ошибку в коде UseSignalR () в Configure:

Невозможно разрешить службу для типа 'Orleans.IClusterClient' при попытке активировать 'SignalR.Orleans.DefaultClusterClientProvider'. '

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;
    }

Тем не менее, я понятия не имею, почему это не работает, поскольку внедрение зависимостей для меня немного ново.

1 Ответ

0 голосов
/ 14 марта 2019

Конструктор 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);
}

Регистрация синглтона должна сделать клиент кластера доступным для конструктора DefaultClusterClientProvider в дополнение к другим объектам (таким как ваши контроллеры ASP.NET Core).

...