我有一个简单的 Hub 类,用于使用注入的用户服务列出用户。还有一个使用 NinjectSignalRDependencyResolver 的启动类,以及非常简单的客户端脚本。
当使用脚本打开客户端时,代码运行并且没有生成任何异常或脚本错误。虽然JavaScript中存在Dashboard对象和Initialize()方法,但它们都没有被调用,因此用户列表从未被填充,因为client.updateStatus从未被调用。
如果我在Hub类中添加一个默认构造函数,则该构造函数会被调用,Initialize方法也会被调用,但很明显由于私有的IUserService变量为空而失败。请注意,HTML标签已保留。
如何配置SignalR 2.0和Ninject以允许Hub具有依赖注入的构造函数参数?
Hub
[HubName("dashboardHub")]
public class DashboardHub : Hub
{
private readonly IUserService _users;
public DashboardHub(IUserService users)
{
_users = users;
}
public void Initialize()
{
var users = _users.ListUsers();
Clients.All.UpdateStatus(users);
}
}
startup.cs
var kernel = new StandardKernel();
var resolver = new NinjectSignalRDependencyResolver(kernel);
var config = new HubConfiguration()
{
Resolver = resolver,
};
app.MapSignalR(config);
NinjectSignalRDependencyResolver
public class NinjectSignalRDependencyResolver : DefaultDependencyResolver
{
private readonly IKernel _kernel;
public NinjectSignalRDependencyResolver(IKernel kernel)
{
_kernel = kernel;
}
public override object GetService(Type serviceType)
{
return _kernel.TryGet(serviceType) ?? base.GetService(serviceType);
}
public override IEnumerable<object> GetServices(Type serviceType)
{
return _kernel.GetAll(serviceType).Concat(base.GetServices(serviceType));
}
}
JavaScript
<script>
$(function () {
var dashboard = $.connection.dashboardHub;
dashboard.client.updateStatus = function (users) {
var elem= $('.userList');
elem.html('');
$.each(users, function (i, user) {
parent.append("<p>" user.Name + "<p>");
});
};
$.connection.hub.start().done(function () {
dashboard.server.initialize();
});
});
</script>
我在 RegisterServices 中以标准方式使用 Ninject 注册接口。
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IUserService >().To<UserService>().InSingletonScope();
...
}
当使用脚本打开客户端时,代码运行并且没有生成任何异常或脚本错误。虽然JavaScript中存在Dashboard对象和Initialize()方法,但它们都没有被调用,因此用户列表从未被填充,因为client.updateStatus从未被调用。
如果我在Hub类中添加一个默认构造函数,则该构造函数会被调用,Initialize方法也会被调用,但很明显由于私有的IUserService变量为空而失败。请注意,HTML标签已保留。
public DashboardHub()
{
}
如何配置SignalR 2.0和Ninject以允许Hub具有依赖注入的构造函数参数?
GlobalHost.DependencyResolver = new NinjectSignalRDependencyResolver(kernel);
? - Rui Jarimba