簡體   English   中英

Autofac相當於這個Ninject代碼的是什么?

[英]What would the Autofac equivalent to this Ninject code be?

在下一頁: 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<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);
    }
}

更新2 :我還想添加試圖編寫的對象。

public class StockTickerHub : Hub
{
    private readonly IStockTicker _stockTicker;

    public StockTickerHub(IStockTicker stockTicker) { }
}

public class StockTicker
{
    public StockTicker(IHubConnectionContext clients) { }
}

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

注意: AutofacDependencyResolver來自Autofac.Integration.SignalR

更新 :啊,我錯過了鏈接頁面的細節; IHubConnectionContext的工廠函數是使用解析器來獲取IConnectionManager ,而不是容器本身(當然容器不會知道IConnectionManager )。 我切換到使用默認依賴項解析器( GlobalHost.DependencyResolver )來獲取IConnectionManager 這應該工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM