2

I am using this way for injecting dependencies into my Hub classes:

public class StructureMapDependencyResolver : DefaultDependencyResolver
{
        private readonly IContainer _container;
        public StructureMapDependencyResolver(IContainer container)
        {
            if (container == null)
            {
                throw new ArgumentNullException("container");
            }
            _container = container;
        }
        public override object GetService(Type serviceType)
        {
            return !serviceType.IsAbstract && !serviceType.IsInterface && serviceType.IsClass
                               ? _container.GetInstance(serviceType)
                               : (_container.TryGetInstance(serviceType) ?? base.GetService(serviceType));
        }
        public override IEnumerable<object> GetServices(Type serviceType)
        {
            return _container.GetAllInstances(serviceType).Cast<object>().Concat(base.GetServices(serviceType));
        }
 }

And for use that, I have these lines of code in Global.asax:

SmObjectFactory.Container.Configure(x =>
            {
                x.For<IDependencyResolver>().Singleton().Add<StructureMapDependencyResolver>();
            });
            GlobalHost.DependencyResolver = SmObjectFactory.Container.GetInstance<IDependencyResolver>();

It worked like a charm in SignalR version 2.1.2, But after upgrading to SignalR version 2.2.0 I get this error:

No default Instance is registered and cannot be automatically determined for type 'Microsoft.AspNet.SignalR.Messaging.IMessageBus'

There is no configuration specified for Microsoft.AspNet.SignalR.Messaging.IMessageBus

1.) new AckSubscriber(*Default of IMessageBus*, *Default of IAckHandler*)
2.) Microsoft.AspNet.SignalR.Infrastructure.AckSubscriber
3.) Instance of Microsoft.AspNet.SignalR.Infrastructure.AckSubscriber
4.) Container.GetInstance(Microsoft.AspNet.SignalR.Infrastructure.AckSubscriber)

It says that it can't resolve IMessageBus! I have tried this solution (+), But it didn't solve the problem.
Should I provide an implementation for that dependency? for example something like this:

x.For<IMessageBus>().Use<MessageBus>();

Any idea?

Community
  • 1
  • 1
Sirwan Afifi
  • 10,654
  • 14
  • 63
  • 110

1 Answers1

4

Thanks @VahidN, Actually I should have resolve from the base class first (+):

public override object GetService(Type serviceType) {
    if (serviceType == null) return null;

    var service = base.GetService(serviceType);
    if (service != null) return service;

    return (!serviceType.IsAbstract && !serviceType.IsInterface && serviceType.IsClass) ? _container.GetInstance(serviceType) : _container.TryGetInstance(serviceType);
} 
Community
  • 1
  • 1
Sirwan Afifi
  • 10,654
  • 14
  • 63
  • 110