C# 与此Ninject代码等效的Autofac是什么?
在下页: 在底部附近(文本“RegisterHubs.Start”的正下方),有一段Ninject代码,我正试图使用Autofac复制它 到目前为止,我已经成功地让自己头疼,但没有多少其他的。我已经搜索了Autofac wiki和web以获得一些帮助。尽管如此,我相信我可能错过了一些小道消息 更新:这是页面上的相关Ninject代码C# 与此Ninject代码等效的Autofac是什么?,c#,signalr,ninject,autofac,C#,Signalr,Ninject,Autofac,在下页: 在底部附近(文本“RegisterHubs.Start”的正下方),有一段Ninject代码,我正试图使用Autofac复制它 到目前为止,我已经成功地让自己头疼,但没有多少其他的。我已经搜索了Autofac wiki和web以获得一些帮助。尽管如此,我相信我可能错过了一些小道消息 更新:这是页面上的相关Ninject代码 public static class RegisterHubs { public static void Start() { va
public static class RegisterHubs
{
public static void Start()
{
var kernel = new StandardKernel();
var resolver = new NinjectSignalRDependencyResolver(kernel);
kernel.Bind<IStockTicker>()
.To<Microsoft.AspNet.SignalR.StockTicker.StockTicker>()
.InSingletonScope();
kernel.Bind<IHubConnectionContext>().ToMethod(context =>
resolver.Resolve<IConnectionManager>().
GetHubContext<StockTickerHub>().Clients
).WhenInjectedInto<IStockTicker>();
var config = new HubConfiguration()
{
Resolver = resolver
};
App.MapSignalR(config);
}
}
Autofac在被喷射到方法时没有与等效的方法。但是,您可以使用命名参数来完成相同的任务 试试这样的
using Autofac.Integration.SignalR;
using Microsoft.AspNet.SignalR.StockTicker;
public static class RegisterHubs
{
public static void Start()
{
var builder = new ContainerBuilder();
builder.RegisterType<StockTicker>()
.WithParameter(ResolvedParameter.ForNamed("StockTickerContext"))
.As<IStockTicker>()
.SingleInstance();
builder.Register(c => GlobalHost.DependencyResolver.Resolve<IConnectionManager>().GetHubContext<StockTickerHub>().Clients)
.Named<IHubConnectionContext>("StockTickerContext");
var container = builder.Build();
var resolver = new AutofacDependencyResolver(container);
var config = new HubConfiguration { Resolver = resolver };
App.MapSignalR(config);
}
}
使用Autofac.Integration.signal;
使用Microsoft.AspNet.signal.StockTicker;
公共静态类寄存器UBS
{
公共静态void Start()
{
var builder=new ContainerBuilder();
builder.RegisterType()
.WithParameter(ResolvedParameter.ForName(“StockTickerContext”))
.As()
.SingleInstance();
builder.Register(c=>GlobalHost.DependencyResolver.Resolve().GetHubContext().Clients)
.命名(“StockTickerContext”);
var container=builder.Build();
var解析器=新的AutofacDependencyResolver(容器);
var config=new-HubConfiguration{Resolver=Resolver};
App.mapsignator(配置);
}
}
注意:AutofacDependencyResolver
来自
更新:啊,我错过了链接页面上的一个小细节;
IHubConnectionContext
的工厂函数使用解析器获取IConnectionManager
,而不是容器本身(当然容器不知道IConnectionManager
)。我转而使用默认的依赖项解析器(GlobalHost.dependencysolver
)来获取IConnectionManager
。这应该行得通。本文中有两个注册表ubs.Start
。你在哪里卡住了?请发布您的代码。您是否设法使其正常工作?您是否使用GlobalHost
获取IConnectionManager?谢谢您的回复。我试了一下,认为它可能会奏效。但是,它不会影响任何类上的构造函数。我会继续尝试不同的方法,看看我是否能找到答案。你绝对确定信号器已经正确映射,并且你在正确的路径上?当您点击/signal/hubs
路线时会发生什么?抱歉,可能应该在前面提到这一点。是的,我在没有DI的情况下启动并运行了这个。我只是想切换到DI作为练习。这可能是我开始的方式?我在信号员创业课上有这个。我将查看是否移动到global.asax/app_start可能会有所帮助。这是我收到的错误消息。。。iisexpress.exe错误:0:任务引发的信号器异常:System.AggregateException:发生一个或多个错误。-->Autofac.Core.Registration.ComponentNotRegisteredException:请求的服务“Microsoft.AspNet.signal.Infrastructure.IConnectionManager”尚未注册。要避免此异常,请注册一个组件以提供服务,使用IsRegistered()检查服务注册,或使用ResolveOptional()方法解析可选依赖项。谢谢!就这样。这个解释也很有帮助。我真的很感谢你的帮助
using Autofac.Integration.SignalR;
using Microsoft.AspNet.SignalR.StockTicker;
public static class RegisterHubs
{
public static void Start()
{
var builder = new ContainerBuilder();
builder.RegisterType<StockTicker>()
.WithParameter(ResolvedParameter.ForNamed("StockTickerContext"))
.As<IStockTicker>()
.SingleInstance();
builder.Register(c => GlobalHost.DependencyResolver.Resolve<IConnectionManager>().GetHubContext<StockTickerHub>().Clients)
.Named<IHubConnectionContext>("StockTickerContext");
var container = builder.Build();
var resolver = new AutofacDependencyResolver(container);
var config = new HubConfiguration { Resolver = resolver };
App.MapSignalR(config);
}
}