C# 与此Ninject代码等效的Autofac是什么?

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

在下页:

在底部附近(文本“RegisterHubs.Start”的正下方),有一段Ninject代码,我正试图使用Autofac复制它

到目前为止,我已经成功地让自己头疼,但没有多少其他的。我已经搜索了Autofac wiki和web以获得一些帮助。尽管如此,我相信我可能错过了一些小道消息

更新:这是页面上的相关Ninject代码

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