2013-04-22 21 views
4

我試圖讓signalR hub作爲使用MEF的插件的一部分。但是,在調用ImportMany對象列表後,然後在Global.asax文件的Application_Start()方法中添加目錄/容器/ ComposeParts部分後,我得到的全部是:使用MEF加載插件後映射SignalR Hub

未捕獲的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」時,則沒有提及我的集線器方法。

非常感謝您的幫助。

+0

我不確定你在做什麼是有道理的。你無法用Hub實例做任何事情。你不擁有它們的創建,並且你不能從服務器調用它們,所以我沒有把它們作爲MEF輸出的重點。 你在找DI嗎? – davidfowl 2013-04-22 09:45:55

+0

假設你有Hub1的Project1和Hub2的project2。當你添加引用Project1和Project2從說你的主MVC項目,然後調用RouteTable.Routes.MapHubs();在global.asax中,你可以在你的javascript中調用hub1和hub 2的所有方法。我試圖找到以編程方式執行該操作的最佳方式,即動態加載包括集線器在內的dll到我的主應用程序中。 – lool 2013-04-22 11:19:04

+0

我很新的插件框架/ DI,所以毫無疑問,我可能會困惑自己 – lool 2013-04-22 11:28:40

回答

3

您的問題是SignalR caches the generated "signalr/hubs" proxy script第一次被請求。 SignalR提供緩存的腳本來響應每個後續對「signalr/hubs」的請求。

SignalR不僅會緩存腳本本身,還會在流程開始時找到它caches the collection of Hubs

您可以解決緩存的代理腳本問題by simply not using the proxy script,但仍然無法實際連接到在進程啓動後加載的程序集中定義的集線器。

如果您希望能夠連接到這樣的集線器,則需要實現您自己的IHubDescriptorProvider,以瞭解在運行時加載的插件中定義的集線器。

你可以註冊SignalR的DependencyResolver它可以通過你傳遞到MapSignalRHubConfiguration對象的Resolver特性傳遞到SignalR提供商。

也就是說,無論何時將插件添加到「./Plugins」目錄中,重新啓動應用程序池/服務器進程可能會更容易。

+0

非常感謝您的指示。其實我找到了另一個解決方案。我很困惑,因爲ReflectedHubDescriptorProvider實際上正在返回新的集線器,但我無法聯繫它。我開始討論這個項目:[https://github.com/cjbhaines/SignalRProxyGenerator](https://github.com/cjbhaines/SignalRProxyGenerator),這對我有很大的幫助。我創建了自己的hubs.js文件,並引用它而不是signalr/hubs。現在運作良好! – lool 2014-04-25 13:54:17