2015-08-21 14 views
7

Tentativo di eseguire l'integrazione delle dipendenze nella classe SignalR Hub utilizzando SignalR-Server, che fa parte di ASP.NET 5 (repo). Ho cercato di capire questo dal tutorial su this link ma non riesco a capire come posso fare questo dato che GlobalHost non è più disponibile. Ecco quello che sto cercando di fare:Come posso configurare SignalR Hub Dipendence Injection in ASP.NET 5 (vNext)?

Startup.cs

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddSignalR(); 
    services.AddSingleton<IState, State>(); 
} 

public void Configure(IApplicationBuilder app) 
{ 
    app.UseSignalR(); 
} 

MyHub.cs

public class MyHub : Hub 
{ 
    public IState State { get; set; } 

    // SignalR accepts this parameterless ctor 
    public MyHub() 
    { 
    } 

    // SignalR won't use this because it has a parameter 
    public MyHub(IState state) 
    { 
     State = state; 
    } 
} 

Come posso ottenere SignalR-Server ad utilizzare il costruttore MyHub(IState state) iniettando la richiesta dipendenze?

+1

Non ho eseguito DI su SignalR utilizzando ASP.NET 5, ma ho eseguito DI in 4.6 e ho funzionato senza utilizzare 'GlobalHost'. Pubblicherò la configurazione una volta arrivato su un computer con Visual Studio. Saluti! –

+0

Fantastico! Sembra che potrebbe aiutare. Pubblica ciò che hai e posso provare ad adattarlo per ASP.NET 5 e il contenitore IOC integrato. Grazie! –

risposta

1

sono riuscito a risolvere questo con l'aggiunta di mia classe State come Singleton per IState in Startup.ConfigureServices, e poi fare una proprietà ServiceProvider disponibile al pubblico su mia classe Startup.cs.Da lì, sono stato in grado di GetRequiredService all'interno del costruttore della mia classe SignalR Hub. Non è la soluzione ideale e spero di essere in grado di adattarlo a utilizzare l'iniezione di proprietà/costruttore quando la piattaforma raggiunge RC.

Ecco il mio codice:

Startup.cs

public static IServiceProvider __serviceProvider; 

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddSignalR(); 
    services.AddSingleton<IState, State>(); 
    __serviceProvider = services.BuildServiceProvider(); 
} 

public void Configure(IApplicationBuilder app) 
{ 
    app.UseSignalR(); 
} 

MyHub.cs

public class MyHub : Hub 
{ 
    public IState State { get; set; } 

    public MyHub() 
    { 
     State = (IState) Startup.__serviceProvider.GetRequiredService(typeof (IState)); 
    } 

    public override Task OnConnected() 
    { 
     State.Clients = Clients; 
     State.Groups = Groups; 
     return base.OnConnected(); 
    } 
} 

In questo modo, sono stato in grado di impostare le proprietà ei metodi di chiamata su IState implementare oggetti dall'interno MyHub, consentendo m e per mantenere lo stato della mia app in memoria.

0

Ok. Ora, ho usato Autofac, che non sono sicuro che abbia ancora l'integrazione con ASP.NET 5. Ma se (per ora) scegli solo .NET 4.6, dovresti stare bene.

Ho appena pubblicato this repository che contiene una configurazione di base del progetto con SignalR e Autofac per l'iniezione delle dipendenze.

Ora, ho fatto la messa a punto iniezione di dipendenza, al fine di conseguire i seguenti obiettivi:

  • essere in grado di iniettare le dipendenze nel mio hub

  • essere in grado di ottenere il contesto per i miei mozzi in ordine per inviare ai clienti al di fuori del centro senza utilizzare GlobalHost (che non è più disponibile in .NET 5, ma anche non dovrebbe essere utilizzato in quanto si tratta di un oggetto globale statica)

Spero che tu riesca a configurare il tuo progetto (anche se non penso che sarai in grado di mantenere DNX nelle opzioni di compilazione dal Autofac non ha ancora la libreria .NET 5 pronta.

Spero che questo aiuti! Buona fortuna!

https://github.com/radu-matei/SignalRDependencyInjection

EDIT: Se si desidera utilizzare Ninject (e costruire il proprio risolutore delle dipendenze, se si desidera raggiungere DNX, è possibile seguire questo repository dai ragazzi ufficiali SignalR (in realtà dal ragazzo che ha scritto SignalR):.

https://github.com/DamianEdwards/NDCLondon2013/tree/master/DependencyInjection

In questa demo usano Ninject di creare il proprio risolutore dipendenza, quindi non dovreste avere problemi di targeting DNX se avete le librerie Ninject

AGGIORNAMENTO: Dopo aver letto un po 'di Dipendenza dell'iniezione in ASP.NET 5, sembra che sia stato eseguito in modo unificato. If you haven't had a look at this article, I recommend it, even though it doesn't specifically show SignalR DI.

+0

Sfortunatamente, sembra che non sia possibile impostare la proprietà 'Resolver' in SignalR-Server! :(L'ho provato prima che venissi anche io. "Torna al tavolo da disegno, suppongo, grazie però! –

+0

Aggiornamento della risposta Spero che ti sia d'aiuto! –

+0

Inoltre, questo [collegamento sembra spiegare DI in vNEXT] (https://robinsedlaczek.wordpress.com/2014/11/22/dependency-injection-in-asp-net-vnext/) –

1

il modo migliore (per Asp.Net 5) creare un sistema di risoluzione personalizzato per DefaultDependencyResolver che riceve IServiceProvider:

public class CustomSignalRDependencyResolver : DefaultDependencyResolver 
{ 
    private readonly IServiceProvider _serviceProvider; 

    public CustomSignalRDependencyResolver(IServiceProvider serviceProvider) 
    { 
     _serviceProvider = serviceProvider; 
    } 

    public override object GetService(Type serviceType) 
    { 
     var service = _serviceProvider.GetService(serviceType); 

     return service ?? base.GetService(serviceType); 
    } 


} 

Poi sulla classe StartUp

public void ConfigureServices(IServiceCollection services) 
    { 

     services.AddSingleton<IState, State>(); 

     //... other services 


     GlobalHost.DependencyResolver = new CustomSignalRDependencyResolver(services.BuildServiceProvider()); 

    } 
0

ho semplicemente fatto costruttore con dipendenze. Ad esempio, ho bisogno dell'istanza IUnitOfWork (che è stata configurata all'avvio) nell'hub. Funziona codice

[HubName("receipts")] 
public class ReceiptsHub : Hub 
{ 
    public IUnitOfWork<string> UnitOfWork { get; set; } 

    public ReceiptsHub(IUnitOfWork<string> unitOfWork) : base() 
    { 
     UnitOfWork = unitOfWork; 
    } 

    public override Task OnConnected() 
    { 
     return base.OnConnected(); 
    } 

    public override Task OnDisconnected(bool stopCalled) 
    { 
     return base.OnDisconnected(stopCalled); 
    } 
} 
0

Sei molto vicino. Hai solo bisogno di:

public class MyHub : Hub 
{ 
    readonly IState _state; 

    public MyHub(IState state) 
    { 
     _state = state; 
    } 
}