我试图让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”时,则没有提及我的集线器方法。
非常感谢您的帮助。
我不确定你在做什么是有道理的。你无法用Hub实例做任何事情。你不拥有它们的创建,并且你不能从服务器调用它们,所以我没有把它们作为MEF输出的重点。 你在找DI吗? – davidfowl 2013-04-22 09:45:55
假设你有Hub1的Project1和Hub2的project2。当你添加引用Project1和Project2从说你的主MVC项目,然后调用RouteTable.Routes.MapHubs();在global.asax中,你可以在你的javascript中调用hub1和hub 2的所有方法。我试图找到以编程方式执行该操作的最佳方式,即动态加载包括集线器在内的dll到我的主应用程序中。 – lool 2013-04-22 11:19:04
我很新的插件框架/ DI,所以毫无疑问,我可能会困惑自己 – lool 2013-04-22 11:28:40