使用MEF加载插件后映射SignalR Hub

时间:2013-04-22 09:42:48

标签: mef signalr

我正在尝试将signalR hub作为使用MEF的插件的一部分。但是在List<>上调用ImportMany之后对象,然后在Global.asax文件的Application_Start()方法中添加目录/容器/ ComposeParts部分,我得到的是:

未捕获的TypeError:无法读取未定义的属性“server”。

如果问题来自我的界面,插件,global.asax文件或javascript,我不知道。

界面:

public interface IPlugin
{

}

插件:

[Export(typeof(IPlugin))]
[HubName("testHub")]
public class TestHub : Hub, IPlugin
{
    public string Message()
    {
        return "Hello World!";
    }
}
Global.asax文件中的

    [ImportMany(typeof (IPlugin))]
    private IEnumerable<IPlugin> _plugins { get; set; }

    protected void Application_Start()
    {
        var catalog = new AggregateCatalog();
        catalog.Catalogs.Add(new DirectoryCatalog(@"./Plugins"));
        var container = new CompositionContainer(catalog);
        container.ComposeParts(this);

        RouteTable.Routes.MapHubs();

        //log4net
        log4net.Config.XmlConfigurator.Configure();

        AreaRegistration.RegisterAllAreas();
        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
    }

最后是javascript:

$(document).ready(function () {
        $.connection.hub.url = 'http://127.0.0.1/signalr/';
        var proxy = $.connection.testHub;
        $.connection.hub.start({ transport: ['webSockets', 'serverSentEvents', 'longPolling'] })
                   .done(function () {
                       proxy.invoke('Message').done(function(res) {
                           alert(res);
                       });
                   })
                   .fail(function () { alert("Could not Connect!"); });
    });

我发现的唯一信息是this post,但我无法使其发挥作用。当我手动添加引用时,一切正常,但是当我在加载插件后查看“signalr / hubs”时,则没有引用我的hub的方法。

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:3)

你的问题是第一次请求SignalR caches the generated "signalr/hubs" proxy script。 SignalR提供缓存脚本以响应每个后续请求&#34; signalr / hubs&#34;。

SignalR不仅缓存脚本本身,而且还在进程开始时找到它caches the collection of Hubs

您可以解决缓存的代理脚本问题by simply not using the proxy script,但仍然无法实际连接到流程启动后加载的程序集中定义的集线器。

如果您希望能够连接到此类集线器,则需要实现自己的IHubDescriptorProvider,该DependencyResolver知道在运行时加载的插件中定义的集线器。

您可以向SignalR&#39; HubConfiguration注册您的提供商,可以通过您传递到MapSignalR的{{3}}对象的Resolver属性将其传递到SignalR。

也就是说,每当插件添加到&#34; ./ Plugins&#34;时,重启app pool / server进程可能会更容易。 。目录