2014-09-29 40 views
1

我想打電話從控制器/ ServiceAssembly在控制器/裝配進樣SignalR 2.0集線器

目前我客戶的方法我使用

//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)); 

但我希望能夠注入一個實例控制器中的集線器,以便我可以使用不同的集線器方法。

我對DependencyInjection使用StructureMap V3

在這方面的任何幫助/方向可以理解

回答

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); 

希望這有助於。

+0

我喜歡你的方法,但是, 我已經在我的項目中使用IHubActivator實施了DI ...注入依賴創建集線器.....但無法注入HubInstances在控制器....你的Apporach顯示我有用DI容器手動註冊我的所有集線器..... 你知道怎麼寫一個約定來給它注入同樣的信號...... – Ankesh 2014-09-30 10:13:04

+0

SignalR正在尋找帶有IAssemblyLocator服務的集線器類型,它返回所有集合以查看成。考慮到這一事實,您可以複製該行爲以註冊您的所有集線器。 – 2014-09-30 14:53:08

+0

也許我誤解了你。你想從你的控制器調用中心方法或客戶端方法? – 2014-09-30 14:57:26