2013-12-11 12 views
7

: http://www.asp.net/signalr/overview/signalr-20/extensibility/dependency-injectionBu Ninject koduna Autofac ne eşdeğerdir? Aşağıdaki sayfada

alt kısmına yakın (sadece metin "RegisterHubs.Start" altında) Ben AutoFac kullanarak çoğaltmak çalışıyorum Ninject kodu parçasıdır yoktur. Şimdiye kadar kendime başım ağrısını vermeyi başarabildim ama çok fazla değil. Autofac vikisini ve interneti biraz yardım için inceledim. Yine de, eminim muhtemelen bir bilgi bilgisi kaçırdım.

Güncelleştirme: İşte sayfada ilgili Ninject kodu var.

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

Güncelleme 2: Ben de oluşur çalışırken nesneleri eklemek düşündüm.

public class StockTickerHub : Hub 
{ 
    private readonly IStockTicker _stockTicker; 

    public StockTickerHub(IStockTicker stockTicker) { } 
} 

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

Makalede iki "RegisterHubs.Start" var. Nereye takılıyorsun? Lütfen kodunuzu gönderin. – Win

+0

Çalışmayı başardınız mı? IConnectionManager'ı almak için 'GlobalHost' kullandınız mı? –

cevap

11

Autofac, WhenInjectedInto yönteminin bir eş değeri yoktur. Bununla birlikte, aynı adlı parametreleri kullanarak da yapabilirsiniz. Bu

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

Not gibi

deneyin şey: AutofacDependencyResolverAutofac.Integration.SignalR geliyor.

Güncelleştirme: Ah, bağlantılı sayfadan küçük bir ayrıntıyı özledim; IHubConnectionContext için fabrika işlevi, IConnectionManager'u almak için özümleyiciyi kullanıyor ve kapsayıcının kendisinden değil (tabii ki kapsayıcı bir IConnectionManager hakkında bilmez). Bunun yerine, varsayılan bağımlılık çözümleyicisini (GlobalHost.DependencyResolver) kullanmak yerine, IConnectionManager'u kullanmaya başladım. Bu işe yaramalı.

+0

Cevabınız için teşekkür ederiz. Bir şey verdim ve hile yapabileceğini düşündüm. Ancak, her iki sınıftaki kurucuları vurmuyor. Farklı şeyleri denemeye devam edip, anlayabileceğime bakmaya devam edeceğim. – Obscured

+0

Ve SignalR'ın doğru şekilde haritalandığından ve doğru yola çıktığınızdan kesinlikle eminsiniz? '/ Signalr/hubs' rotasını vurduğunuzda ne olur? – khellang

+0

Üzgünüm, muhtemelen daha önce belirtmiş olmalıydı. Evet, bunu DI olmadan kullanıyorum. Sadece DI olarak bir egzersiz yapmak istedim. Başlayabilmem mümkün olabilir mi? Sinyalr başlangıç ​​sınıfında bu vardı. Global.asax/app_start'a geçmenin faydalı olabileceğini göreceğim. – Obscured