1

我想从控制器/ServiceAssembly 调用我的客户端方法

目前我正在使用

//Notify Others of the Login 
GlobalHost.ConnectionManager.GetHubContext<NotificationHub>().Clients.All.NotifyOthersAllOnLogin(string.Format("Recent Login({2}): {0} {1}", account.FirstName,account.LastName, account.LastLogin));

但我希望能够在控制器中注入集线器实例,以便我可以使用不同的集线器方法。

我正在使用StructureMap V3DependencyInjection。

在这方面的任何帮助/方向将不胜感激

4

1 回答 1

3

SignalR中有一个依赖注入的教程:http ://www.asp.net/signalr/overview/signalr-20/extensibility/dependency-injection 。示例用于 NInject,但您可以轻松自定义它。您需要记住的是,在初始化 SignalR(映射集线器)之前配置您的 DI 容器。

然后您可以注册您的集线器上下文以便能够解决它。非常重要的是,您在映射集线器后注册集线器上下文。Hub 上下文可以保存到变量中并根据需要存储。您的启动配置方法如下所示:

public void Configure(IAppBuilder app)
{
    var resolver = new MyStructureMapResolver();

    // configure depdendency resolver
    GlobalHost.DependencyResolver = this.container.Resolve<IDependencyResolver>();

    // map the hubs
    app.MapSignalR();

    // get your hub context
    var hubContext = GlobalHost.ConnectionManager.GetHubContext<NotificationHub>();

    // register it in your structure map
    ObjectFactory.Inject<IHubContext>(hubContext);
}    

要使您的集线器上下文强类型化,您可以执行以下操作:

public interface INotificationHubContext {
    void NotifyOthersAllOnLogin(string msg);
}

然后你做这个:

// get your hub context
var hubContext = GlobalHost.ConnectionManager.GetHubContext<NotificationHub, INotificationHubContext>();

// register it in your structure map
ObjectFactory.Inject<IHubContext<INotificationHubContext>>(hubContext);

希望这可以帮助。

于 2014-09-30T07:49:01.940 回答