/src/Castle.Windsor/MicroKernel/DefaultKernel_Events.cs

https://github.com/castleproject/Castle.Windsor-READONLY · C# · 184 lines · 131 code · 35 blank · 18 comment · 6 complexity · 952172026360fe204dcc73defee76a7e MD5 · raw file

  1. // Copyright 2004-2011 Castle Project - http://www.castleproject.org/
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. namespace Castle.MicroKernel
  15. {
  16. using System;
  17. using System.Security;
  18. using Castle.Core;
  19. /// <summary>
  20. /// Default implementation of <see cref = "IKernel" />.
  21. /// This implementation is complete and also support a kernel
  22. /// hierarchy (sub containers).
  23. /// </summary>
  24. public partial class DefaultKernel
  25. {
  26. private readonly object handlersChangedLock = new object();
  27. private bool handlersChanged;
  28. private volatile bool handlersChangedDeferred;
  29. #if !SILVERLIGHT
  30. #if DOTNET40
  31. [SecurityCritical]
  32. #endif
  33. public override object InitializeLifetimeService()
  34. {
  35. return null;
  36. }
  37. #endif
  38. public IDisposable OptimizeDependencyResolution()
  39. {
  40. if (handlersChangedDeferred)
  41. {
  42. return null;
  43. }
  44. handlersChangedDeferred = true;
  45. return new OptimizeDependencyResolutionDisposable(this);
  46. }
  47. protected virtual void RaiseAddedAsChildKernel()
  48. {
  49. AddedAsChildKernel(this, EventArgs.Empty);
  50. }
  51. protected virtual void RaiseComponentCreated(ComponentModel model, object instance)
  52. {
  53. ComponentCreated(model, instance);
  54. }
  55. protected virtual void RaiseComponentDestroyed(ComponentModel model, object instance)
  56. {
  57. ComponentDestroyed(model, instance);
  58. }
  59. protected virtual void RaiseComponentModelCreated(ComponentModel model)
  60. {
  61. ComponentModelCreated(model);
  62. }
  63. protected virtual void RaiseComponentRegistered(String key, IHandler handler)
  64. {
  65. ComponentRegistered(key, handler);
  66. }
  67. protected virtual void RaiseDependencyResolving(ComponentModel client, DependencyModel model, Object dependency)
  68. {
  69. DependencyResolving(client, model, dependency);
  70. }
  71. protected virtual void RaiseHandlerRegistered(IHandler handler)
  72. {
  73. var stateChanged = true;
  74. while (stateChanged)
  75. {
  76. stateChanged = false;
  77. HandlerRegistered(handler, ref stateChanged);
  78. }
  79. }
  80. protected virtual void RaiseHandlersChanged()
  81. {
  82. if (handlersChangedDeferred)
  83. {
  84. lock (handlersChangedLock)
  85. {
  86. handlersChanged = true;
  87. }
  88. return;
  89. }
  90. DoActualRaisingOfHandlersChanged();
  91. }
  92. protected virtual void RaiseRegistrationCompleted()
  93. {
  94. RegistrationCompleted(this, EventArgs.Empty);
  95. }
  96. protected virtual void RaiseRemovedAsChildKernel()
  97. {
  98. RemovedAsChildKernel(this, EventArgs.Empty);
  99. }
  100. private void DoActualRaisingOfHandlersChanged()
  101. {
  102. var stateChanged = true;
  103. while (stateChanged)
  104. {
  105. stateChanged = false;
  106. HandlersChanged(ref stateChanged);
  107. }
  108. }
  109. public event HandlerDelegate HandlerRegistered = delegate { };
  110. public event HandlersChangedDelegate HandlersChanged = delegate { };
  111. public event ComponentDataDelegate ComponentRegistered = delegate { };
  112. public event ComponentInstanceDelegate ComponentCreated = delegate { };
  113. public event ComponentInstanceDelegate ComponentDestroyed = delegate { };
  114. public event EventHandler AddedAsChildKernel = delegate { };
  115. public event EventHandler RegistrationCompleted = delegate { };
  116. public event EventHandler RemovedAsChildKernel = delegate { };
  117. public event ComponentModelDelegate ComponentModelCreated = delegate { };
  118. public event DependencyDelegate DependencyResolving = delegate { };
  119. public event ServiceDelegate EmptyCollectionResolving = delegate { };
  120. private class OptimizeDependencyResolutionDisposable : IDisposable
  121. {
  122. private readonly DefaultKernel kernel;
  123. public OptimizeDependencyResolutionDisposable(DefaultKernel kernel)
  124. {
  125. this.kernel = kernel;
  126. }
  127. public void Dispose()
  128. {
  129. lock (kernel.handlersChangedLock)
  130. {
  131. try
  132. {
  133. if (kernel.handlersChanged == false)
  134. {
  135. return;
  136. }
  137. kernel.DoActualRaisingOfHandlersChanged();
  138. kernel.RaiseRegistrationCompleted();
  139. kernel.handlersChanged = false;
  140. }
  141. finally
  142. {
  143. kernel.handlersChangedDeferred = false;
  144. }
  145. }
  146. }
  147. }
  148. }
  149. }