Reputation: 26909
I've just switched Dependency Injection frameworks from Ninject to StructureMap - due to Ninject producing abysmally bad performance!
Problem I'm having is that when I wire up the DependencyResolver, my hubs are being cleared out by the RouteTable.Routes.MapHubs line:
GlobalHost.DependencyResolver = new SignalRDependencyResolver(ObjectFactory.Container);
RouteTable.Routes.MapHubs(GlobalHost.DependencyResolver);
Meaning the hubs object in the /SignalR/hubs javascript file has an empty Hubs object.
I'm assigning the DependencyResolver in application_start like in the wiki, and I'm doing my MVC4 and WebAPI Dependency Resolvers AFTER SignalR's.
What could be causing this?
Update - here is the DependencyResolver Implementation:
public class SignalRDependencyResolver : DefaultDependencyResolver
{
private IContainer _container;
public SignalRDependencyResolver(IContainer container)
{
_container = container;
}
public override object GetService(Type serviceType)
{
object service = null;
if (!serviceType.IsAbstract && !serviceType.IsInterface && serviceType.IsClass)
{
// Concrete type resolution
service = _container.GetInstance(serviceType);
}
else
{
// Other type resolution with base fallback
service = _container.TryGetInstance(serviceType) ?? base.GetService(serviceType);
}
return service;
}
public override IEnumerable<object> GetServices(Type serviceType)
{
var objects = _container.GetAllInstances(serviceType).Cast<object>();
objects.Concat(base.GetServices(serviceType));
return objects;
}
}
Upvotes: 2
Views: 570
Reputation: 26909
Here is the Dependency Resolver Implementation that worked in the end:
public class SignalRDependencyResolver : SignalR.DefaultDependencyResolver
{
private readonly IContainer _container;
public SignalRDependencyResolver(IContainer container)
{
if (container == null)
{
throw new ArgumentNullException("container");
}
_container = container;
}
public override object GetService(Type serviceType)
{
var instance = _container.TryGetInstance(serviceType) ?? base.GetService(serviceType);
return instance;
}
public override IEnumerable<object> GetServices(Type serviceType)
{
IEnumerable<object> instances = _container.GetAllInstances(serviceType).Cast<object>();
IEnumerable<object> instances2 = base.GetServices(serviceType);
return instances2.Concat(instances);
}
}
Upvotes: 2