Внедрение зависимостей SignalR 2 с помощью Ninject 3.2.0, MVC 5.2.3 и .NET 4.5.1

Я не могу заставить работать и концентратор, и мой репозиторий одновременно. Я считаю, что это потому, что для привязки используются два разных ядра. Когда я выполняю предлагаемое исправление, указанное ниже (одно ядро), клиентская сторона прекращает обработку широковещательных сообщений.

Я создал приложение на основе Тикер акций SignalR. Это сработало, как и ожидалось. Затем я выполнил внедрение зависимостей в SignalR для включения DI с Ninject. Это тоже сработало. Затем я добавил свой сервисный проект в решение. Добавлены мои привязки к NinjectWebCommon, чтобы включить репозитории моего сервиса. Я изменил свой одноэлементный класс, чтобы включить репозиторий.

    public class AndonDisplay : IAndonDisplay
{
    private readonly IReadOnlyRepository _repo;
    private readonly AndonDisplayMsgSet _msgSet;

    private readonly object _updateAndonDisplayLock = new object();
    private volatile bool _updatingAndonDisplay = false;

    public AndonDisplay(IHubConnectionContext<dynamic> clients, IReadOnlyRepository repo)
    {
        _repo = repo;
        Clients = clients;
        _msgSet = new AndonDisplayMsgSet { Advisory = "", Maintenance = "<div class='lblDT'>OK</div>", Supervisor = "OK", Materials = "OK" };
    }

На данный момент синглтон никогда не вызывается. Никаких сообщений об ошибках, которые я мог видеть. Просто не звонил. Затем я внес предложенные изменения в ответ с наибольшим количеством голосов в сообщении, указанном ниже, «исходный вопрос ...». Это исправило все, кроме передачи Clients.All. Теперь он не обрабатывался на стороне клиента. У меня есть репо, которое работает в синглтоне. Я вижу, что вызывается Clients.All. Скрипт на стороне клиента никогда не выполняется.

Я нашел этот вопрос разработчиков... Исходный вопрос опубликован. Как заявляет разработчик в комментариях к последнему опубликованному "ответу"...

"... Я не знаю, как соединить две части вместе. В примере Stock Ticker вы создаете ядро ​​​​в Startup.cs, но я также создаю ядро ​​​​в NinjectWebCommon, и они не знают о друг друга. Dismissile 22 янв.

У кого-нибудь есть решение для этого?

Обновление:

Если я удалю .InSingletonScope() из моего оператора привязки:

            kernel.Bind<IAndonDisplay>().To<AndonDisplay>(); //.InSingletonScope();  // Make it a singleton object.

тогда мой концентратор, в который внедрен IAndonDisplay, имеет полнофункциональный репозиторий?!?!

Вот мой NinjectWebCommon RegisterServices

        private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<AndonVistechContext>().ToSelf().InRequestScope();
        kernel.Bind<IRepository>().To<EntityFrameworkRepository<AndonVistechContext>>().InRequestScope();
        kernel.Bind<IReadOnlyRepository>().To<EfReadOnlyRepository.EntityFrameworkReadOnlyRepository<AndonVistechContext>>().InRequestScope();
        kernel.Bind<IAndonDisplay>().To<AndonDisplay>(); //.InSingletonScope();  // Make it a singleton object.
        kernel.Bind(typeof(IHubConnectionContext<dynamic>)).ToMethod(context => GlobalHost.DependencyResolver.Resolve<IConnectionManager>().GetHubContext<AndonDisplayHub>().Clients).WhenInjectedInto<IAndonDisplay>();
    }

Я уверен, что упускаю что-то очевидное.


person midohioboarder    schedule 26.05.2017    source источник