在下一页:http://www.asp.net/signalr/overview/signalr-20/extensibility/dependency-injection
在底部附近(正好在文本"RegisterHubs.Start"下方),我试图使用Autofac重现一段Ninject代码.
到目前为止,我已经成功地让自己头痛,但没有多少.我已经搜索了Autofac wiki和网络以获得一些帮助.虽然,我相信我可能错过了一些信息.
更新:这是页面上的相关Ninject代码.
public static class RegisterHubs { public static void Start() { var kernel = new StandardKernel(); var resolver = new NinjectSignalRDependencyResolver(kernel); kernel.Bind() .To () .InSingletonScope(); kernel.Bind ().ToMethod(context => resolver.Resolve (). GetHubContext ().Clients ).WhenInjectedInto (); var config = new HubConfiguration() { Resolver = resolver }; App.MapSignalR(config); } }
更新2:我还想添加试图编写的对象.
public class StockTickerHub : Hub { private readonly IStockTicker _stockTicker; public StockTickerHub(IStockTicker stockTicker) { } } public class StockTicker { public StockTicker(IHubConnectionContext clients) { } }
khellang.. 12
Autofac没有相应的WhenInjectedInto
方法.但是,您可以使用命名参数完成相同的操作.
尝试这样的事情
using Autofac.Integration.SignalR; using Microsoft.AspNet.SignalR.StockTicker; public static class RegisterHubs { public static void Start() { var builder = new ContainerBuilder(); builder.RegisterType() .WithParameter(ResolvedParameter.ForNamed("StockTickerContext")) .As () .SingleInstance(); builder.Register(c => GlobalHost.DependencyResolver.Resolve ().GetHubContext ().Clients) .Named ("StockTickerContext"); var container = builder.Build(); var resolver = new AutofacDependencyResolver(container); var config = new HubConfiguration { Resolver = resolver }; App.MapSignalR(config); } }
注意:AutofacDependencyResolver
来自Autofac.Integration.SignalR
.
更新:啊,我错过了链接页面的细节; 工厂的功能IHubConnectionContext
是使用解析器获取IConnectionManager
,而不是容器本身(当然容器不会知道a IConnectionManager
).我切换到使用默认依赖项解析器(GlobalHost.DependencyResolver
)来获取IConnectionManager
.这应该工作.