using System; using System.Collections.Generic; using System.Linq; using System.Text; using Autofac; using Autofac.Builder; using Autofac.Core; using SignalR; namespace NzbDrone.Core { public class AutofacSignalrDependencyResolver : DefaultDependencyResolver, IDependencyResolver, IRegistrationSource { private ILifetimeScope LifetimeScope { get; set; } public AutofacSignalrDependencyResolver(ILifetimeScope lifetimeScope) { LifetimeScope = lifetimeScope; var currentRegistrationSource = LifetimeScope.ComponentRegistry.Sources.FirstOrDefault(s => s.GetType() == GetType()); if (currentRegistrationSource != null) { ((AutofacSignalrDependencyResolver)currentRegistrationSource).LifetimeScope = lifetimeScope; } else { LifetimeScope.ComponentRegistry.AddRegistrationSource(this); } } public AutofacSignalrDependencyResolver() { } public override object GetService(Type serviceType) { object result; if (LifetimeScope == null) { return base.GetService(serviceType); } if (LifetimeScope.TryResolve(serviceType, out result)) { return result; } return null; } public override IEnumerable GetServices(Type serviceType) { object result; if (LifetimeScope == null) { return base.GetServices(serviceType); } if (LifetimeScope.TryResolve(typeof(IEnumerable<>).MakeGenericType(serviceType), out result)) { return (IEnumerable)result; } return Enumerable.Empty(); } public IEnumerable RegistrationsFor(Service service, Func> registrationAccessor) { var typedService = service as TypedService; if (typedService != null) { var instances = base.GetServices(typedService.ServiceType); if (instances != null) { return instances .Select(i => RegistrationBuilder.ForDelegate(i.GetType(), (c, p) => i).As(typedService.ServiceType) .InstancePerLifetimeScope() .PreserveExistingDefaults() .CreateRegistration()); } } return Enumerable.Empty(); } bool IRegistrationSource.IsAdapterForIndividualComponents { get { return false; } } } }