2017-01-13 2 views
0

This guide scheint nicht für SimpleInjector zu funktionieren.Holen Sie den HubContext mit SimpleInjector

Mein OWIN Start sieht wie folgt aus:

container = new Container(); 
container.Options.DefaultScopedLifestyle = new ExecutionContextScopeLifestyle(); 

container.RegisterSingleton(() => new SimpleInjectorSignalRDependencyResolver(_container)); 
container.RegisterSingleton(() => 
    new HubConfiguration() 
    { 
     EnableDetailedErrors = true, 
     Resolver = _container.GetInstance<SimpleInjectorSignalRDependencyResolver>() 
    }); 

container.RegisterSingleton<IHubActivator, SimpleInjectorHubActivator>(); 
container.RegisterSingleton<IStockTicker,StockTicker>(); 
container.RegisterSingleton<HubContextAdapter<StockTickerHub, IStockTickerHubClient>>(); 
container.RegisterSingleton(() => GlobalHost.ConnectionManager); 
container.Verify(); 

GlobalHost.DependencyResolver = container.GetInstance<SimpleInjectorSignalRDependencyResolver>(); 

app.Use(async (context, next) => 
{ 
    using (container.BeginExecutionContextScope()) 
    { 
     await next(); 
    } 
}); 

app.MapSignalR(container.GetInstance<HubConfiguration>()); 

And The HubContextAdapter sieht wie folgt aus:

public class HubContextAdapter<THub, TClient> 
    where THub : Hub 
    where TClient : class 
{ 
    private readonly IConnectionManager _manager; 

    public HubContextAdapter(IConnectionManager manager) 
    { 
     _manager = manager; 
    } 

    public IHubContext<TClient> GetHubContext() 
    { 
     return _manager.GetHubContext<THub, TClient>(); 
    } 
} 

Und SimpleInjectorSignalRDependencyResolver wie folgt aussieht:

public class SimpleInjectorSignalRDependencyResolver : DefaultDependencyResolver 
{ 
    public SimpleInjectorSignalRDependencyResolver(IServiceProvider serviceProvider) 
    { 
     _serviceProvider = serviceProvider; 
    } 

    public override object GetService(Type serviceType) 
    { 
     return _serviceProvider.GetService(serviceType) ?? base.GetService(serviceType); 
    } 

    public override IEnumerable<object> GetServices(Type serviceType) 
    { 
     var @this = (IEnumerable<object>)_serviceProvider.GetService(
      typeof(IEnumerable<>).MakeGenericType(serviceType)); 

     var @base = base.GetServices(serviceType); 

     return @this == null ? @base : @base == null ? @this : @this.Concat(@base); 
    } 

    private readonly IServiceProvider _serviceProvider; 
} 

Und StockTicker wie folgt aussieht:

public class StockTicker : IStockTicker 
{ 
    private readonly HubContextAdapter<StockTickerHub, IStockTickerHubClient> _context; 

    public StockTicker(HubContextAdapter<StockTickerHub, IStockTickerHubClient> context) 
    { 
     _context = context; 
    } 
} 

Wenn die StockTicker Zecken und ruft alle Clients die Client-Methode aktualisieren nicht aufgerufen werden, und es ist kein Netzwerkverkehr.

Antwort

0

SimpleInjector möchte die Singletons nach Verifikation oder nach dem ersten GetInstance Aufruf instanziieren. Dies ist zu früh für SignalR und StockTicker und es wird eine Instanz von benötigt, bevor SimpleInjectorSignalRDependencyResolver der Resolver ist.

Ich wählte die Abhängigkeit von IConnectionManager zu ändern Lazy<IConnectionManager> und die Abhängigkeit von IStockTicker zu sein, dass die Registrierung sein Lazy<IStockTicker> so wurde wie folgt aus:

container = new Container(); 
container.Options.DefaultScopedLifestyle = new ExecutionContextScopeLifestyle(); 

container.RegisterSingleton(() => new SimpleInjectorSignalRDependencyResolver(_container)); 
container.RegisterSingleton(() => 
    new HubConfiguration() 
    { 
     EnableDetailedErrors = true, 
     Resolver = _container.GetInstance<SimpleInjectorSignalRDependencyResolver>() 
    }); 

container.RegisterSingleton<IHubActivator, SimpleInjectorHubActivator>(); 
container.RegisterSingleton<IStockTicker,StockTicker>(); 
container.RegisterSingleton<Lazy<IStockTicker>>(() => new Lazy<IStockTicker>(() => container.GetInstace<IStockTicker>())); 
container.RegisterSingleton<HubContextAdapter<StockTickerHub, IStockTickerHubClient>>(); 
container.RegisterSingleton(() => new Lazy<IConnectionManager>(() => GlobalHost.ConnectionManager)); 
container.Verify(); 
Verwandte Themen