PageRenderTime 39ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 1ms

/SignalR/Infrastructure/DefaultDependencyResolver.cs

https://github.com/kpmrafeeq/SignalR
C# | 147 lines | 121 code | 25 blank | 1 comment | 9 complexity | 7a0b2bb0c77ac355f294ae7d2bcce1ca MD5 | raw file
Possible License(s): MIT
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using SignalR.Hubs;
  5. using SignalR.Infrastructure;
  6. using SignalR.Transports;
  7. namespace SignalR
  8. {
  9. public class DefaultDependencyResolver : IDependencyResolver
  10. {
  11. private readonly Dictionary<Type, IList<Func<object>>> _resolvers = new Dictionary<Type, IList<Func<object>>>();
  12. public DefaultDependencyResolver()
  13. {
  14. RegisterDefaultServices();
  15. // Hubs
  16. RegisterHubExtensions();
  17. }
  18. private void RegisterDefaultServices()
  19. {
  20. var traceManager = new Lazy<TraceManager>(() => new TraceManager());
  21. Register(typeof(ITraceManager), () => traceManager.Value);
  22. var serverIdManager = new ServerIdManager();
  23. Register(typeof(IServerIdManager), () => serverIdManager);
  24. var serverMessageHandler = new Lazy<IServerCommandHandler>(() => new ServerCommandHandler(this));
  25. Register(typeof(IServerCommandHandler), () => serverMessageHandler.Value);
  26. var messageBus = new Lazy<InProcessMessageBus>(() => new InProcessMessageBus(this));
  27. Register(typeof(IMessageBus), () => messageBus.Value);
  28. var serializer = new Lazy<JsonNetSerializer>();
  29. Register(typeof(IJsonSerializer), () => serializer.Value);
  30. var connectionIdGenerator = new GuidConnectionIdGenerator();
  31. Register(typeof(IConnectionIdGenerator), () => connectionIdGenerator);
  32. var transportManager = new Lazy<TransportManager>(() => new TransportManager(this));
  33. Register(typeof(ITransportManager), () => transportManager.Value);
  34. var configurationManager = new DefaultConfigurationManager();
  35. Register(typeof(IConfigurationManager), () => configurationManager);
  36. var transportHeartbeat = new Lazy<TransportHeartBeat>(() => new TransportHeartBeat(this));
  37. Register(typeof(ITransportHeartBeat), () => transportHeartbeat.Value);
  38. var connectionManager = new Lazy<ConnectionManager>(() => new ConnectionManager(this));
  39. Register(typeof(IConnectionManager), () => connectionManager.Value);
  40. }
  41. private void RegisterHubExtensions()
  42. {
  43. var methodDescriptorProvider = new Lazy<ReflectedMethodDescriptorProvider>();
  44. Register(typeof(IMethodDescriptorProvider), () => methodDescriptorProvider.Value);
  45. var hubDescriptorProvider = new Lazy<ReflectedHubDescriptorProvider>(() => new ReflectedHubDescriptorProvider(this));
  46. Register(typeof(IHubDescriptorProvider), () => hubDescriptorProvider.Value);
  47. var parameterBinder = new Lazy<DefaultParameterResolver>();
  48. Register(typeof(IParameterResolver), () => parameterBinder.Value);
  49. var activator = new Lazy<DefaultHubActivator>(() => new DefaultHubActivator(this));
  50. Register(typeof(IHubActivator), () => activator.Value);
  51. var hubManager = new Lazy<DefaultHubManager>(() => new DefaultHubManager(this));
  52. Register(typeof(IHubManager), () => hubManager.Value);
  53. var proxyGenerator = new Lazy<DefaultJavaScriptProxyGenerator>(() => new DefaultJavaScriptProxyGenerator(this));
  54. Register(typeof(IJavaScriptProxyGenerator), () => proxyGenerator.Value);
  55. var requestParser = new Lazy<HubRequestParser>();
  56. Register(typeof(IHubRequestParser), () => requestParser.Value);
  57. var assemblyLocator = new Lazy<DefaultAssemblyLocator>(() => new DefaultAssemblyLocator());
  58. Register(typeof(IAssemblyLocator), () => assemblyLocator.Value);
  59. }
  60. public virtual object GetService(Type serviceType)
  61. {
  62. IList<Func<object>> activators;
  63. if (_resolvers.TryGetValue(serviceType, out activators))
  64. {
  65. if (activators.Count == 0)
  66. {
  67. return null;
  68. }
  69. if (activators.Count > 1)
  70. {
  71. throw new InvalidOperationException(String.Format("Multiple activators for type {0} are registered. Please call GetServices instead.", serviceType.FullName));
  72. }
  73. return activators[0]();
  74. }
  75. return null;
  76. }
  77. public virtual IEnumerable<object> GetServices(Type serviceType)
  78. {
  79. IList<Func<object>> activators;
  80. if (_resolvers.TryGetValue(serviceType, out activators))
  81. {
  82. if (activators.Count == 0)
  83. {
  84. return null;
  85. }
  86. return activators.Select(r => r()).ToList();
  87. }
  88. return null;
  89. }
  90. public virtual void Register(Type serviceType, Func<object> activator)
  91. {
  92. IList<Func<object>> activators;
  93. if (!_resolvers.TryGetValue(serviceType, out activators))
  94. {
  95. activators = new List<Func<object>>();
  96. _resolvers.Add(serviceType, activators);
  97. }
  98. else
  99. {
  100. activators.Clear();
  101. }
  102. activators.Add(activator);
  103. }
  104. public virtual void Register(Type serviceType, IEnumerable<Func<object>> activators)
  105. {
  106. IList<Func<object>> list;
  107. if (!_resolvers.TryGetValue(serviceType, out list))
  108. {
  109. list = new List<Func<object>>();
  110. _resolvers.Add(serviceType, list);
  111. }
  112. else
  113. {
  114. list.Clear();
  115. }
  116. foreach (var a in activators)
  117. {
  118. list.Add(a);
  119. }
  120. }
  121. }
  122. }