SignalR.EventAggregatorProxy简单示例问题

时间:2015-11-02 15:48:50

标签: c# signalr asp.net-web-api eventaggregator

我试图使用SignalR.EventAggregatorProxy 图书馆,但我无法理解文档或演示。我不需要在服务器端和Angular SPA上使用WEB API的非常简单的测试应用程序之后使用Ninject和我。

这是我到目前为止所做的:

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>

当我运行应用时,我得到&#34; TypeError:无法读取属性&#39;订阅&#39;未定义&#34;错误指向行

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

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

我确定我错过了什么,但我不确定是什么。

Wiki中有一部分称为实现约束处理程序(https://github.com/AndersMalmgren/SignalR.EventAggregatorProxy/wiki/Implement-constraint-handlers),它应该像从继承类继承一样简单,但我不确定需要从这个类继承什么。< / p>

console output

2 个答案:

答案 0 :(得分:1)

我是图书馆的作者,

它不是设计为使用简单的数据类型作为消息。

您需要一个消息基类,例如

public abstract class Message {}

创建实际消息

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

现在在配置更改中使用基类,这是一种让库知道哪些messagss应该被代理到javascript的方法

app.MapEventProxy<Message>();

在您的活动中代理更改为

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

现在在您的客户端更改为

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

我应该更新Invoke方法,使类型对象采用约束类

的泛型类型

答案 1 :(得分:1)

问题出在index.html文件中的JS依赖项的顺序。

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

它确实有意义......现在......