SignalR.EventAggregatorProxy простой пример проблемы

Я пытаюсь использовать библиотеку SignalR.EventAggregatorProxy, но не могу разобраться с документами или демонстрациями. Мне не нужно использовать Ninject, и я только после очень простого приложения tes с WEB API на стороне сервера и Angular SPA.

Вот что у меня есть:

Startup.cs

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.MapSignalR();

        var proxy = new Lazy<IEventAggregator>(() => new Eventer());
        GlobalHost.DependencyResolver.Register(typeof(IEventAggregator), () => proxy.Value);

        app.MapEventProxy<Message>();
    }
}

классы сообщений

public abstract class Message {}

public class MyMessage : Message
{
    public int Number { get; set; }
}

Событие стрельбы класса Eventer.cs

public class Eventer : IEventAggregator
{
    public void Subscribe(Action<object> handler)
    {
        Task.Factory.StartNew(() =>
        {
            int number = 0;

            while (true)
            {
                handler.Invoke(new MyMessage { Number = number++ });
                System.Threading.Thread.Sleep(1000);
            }
        });
    }
}

простой app.js

(function () {
    'use strict';

    var app = angular.module("TestApp", ['signalR.eventAggregator']);

    app.controller("TestCtrl", ['$scope','$http', function ($scope, $http) {

        function onEvent(e) {
            console.log("event received => ", e);
        };

        $scope.eventAggregator().subscribe(EventAgrTest.Events.MyMessage, onEvent);

        $scope.headerText = "HEADER";
    }]);
})();

и index.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" ng-app="TestApp">
<head>
    <title></title>

    <script src="Scripts/jquery-1.6.4.js"></script>
    <script src="Scripts/jquery.signalR-2.2.0.js"></script>
    <script src="Scripts/jquery.signalR.eventAggregator-1.4.141.0.js"></script>
    <script src="/signalr/hubs"></script>
    <script src="/eventAggregation/events"></script>
</head>
<body ng-controller="TestCtrl">

    <h1>{{headerText}}</h1>

    <script src="Scripts/angular.js"></script>
    <script src="Scripts/jquery.signalR.eventAggregator.angular-1.4.143.0.js"></script>

    <script src="Scripts/app.js"></script>
</body>
</html>

Когда я запускаю приложение, я получаю сообщение об ошибке "TypeError: Невозможно прочитать свойство" подписка "неопределенного", указывающее на строку

signalR.eventAggregator.subscribe(type, function(e) { ...

в jquery.signalR.eventAggregator.angular-1.4.143.0.js

Я уверен, что что-то упустил, но я не уверен, что.

В вики есть часть под названием Обработчики ограничений реализации ( https://github.com/AndersMalmgren/SignalR.EventAggregatorProxy/wiki/Implement-constraint-handlers), для которой она должна быть такой же простой, как и наследование от абстрактного класса, но я не уверен, что нужно наследовать от этого класса.

консольный вывод

2 ответа

Решение

Проблема была в порядке JS-зависимостей в файле index.html.

<script src="/signalr/hubs"></script>

должно быть раньше

<script src="Scripts/jquery.signalR.eventAggregator-1.4.141.0.js"></script>

Вот как это должно выглядеть...

<script src="Scripts/jquery-1.6.4.js"></script>
<script src="Scripts/jquery.signalR-2.2.0.js"></script>
<script src="/signalr/hubs"></script>
<script src="Scripts/jquery.signalR.eventAggregator-1.4.141.0.js"></script>
<script src="/eventAggregation/events"></script>

<script src="Scripts/angular.js"></script>
<script src="Scripts/jquery.signalR.eventAggregator.angular-1.4.143.0.js"></script>

это имеет смысл... сейчас...

Я автор библиотеки,

Он не был предназначен для использования простых типов данных в качестве сообщений.

Вам нужен базовый класс сообщений, например

public abstract class Message {}

Создать актуальное сообщение

public class MyMessage : Message 
{
    public int Number { get;set; }
}

Теперь при изменении конфигурации используйте базовый класс, это способ дать библиотеке понять, какие сообщения должны быть переданы в javascript.

app.MapEventProxy<Message>();

В вашем случае прокси изменить на

handler.Invoke(new MyMessage { Number = number++ });

Теперь в вашем клиенте измените на

$scope.eventAggregator().subscribe(EventAgrTest.Events.MyMessage, onEvent);

Я должен обновить метод Invoke, чтобы он брал объект типа, чтобы он брал общий тип с классом ограничений.

Другие вопросы по тегам