DefaultKernel
public class DefaultKernel : MarshalByRefObject, IKernel, IKernelEvents, IDisposable, IKernelInternal
Default implementation of IKernel. This implementation is complete and also support a kernel hierarchy (sub containers).
using Castle.Core;
using Castle.Core.Internal;
using Castle.Core.Logging;
using Castle.MicroKernel.ComponentActivator;
using Castle.MicroKernel.Context;
using Castle.MicroKernel.Handlers;
using Castle.MicroKernel.Lifestyle;
using Castle.MicroKernel.Lifestyle.Scoped;
using Castle.MicroKernel.ModelBuilder;
using Castle.MicroKernel.ModelBuilder.Inspectors;
using Castle.MicroKernel.Proxy;
using Castle.MicroKernel.Registration;
using Castle.MicroKernel.Releasers;
using Castle.MicroKernel.Resolvers;
using Castle.MicroKernel.SubSystems.Configuration;
using Castle.MicroKernel.SubSystems.Conversion;
using Castle.MicroKernel.SubSystems.Naming;
using Castle.MicroKernel.SubSystems.Resource;
using Castle.Windsor.Diagnostics;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.Serialization;
using System.Security;
using System.Security.Permissions;
namespace Castle.MicroKernel
{
[Serializable]
[DebuggerTypeProxy(typeof(KernelDebuggerProxy))]
public class DefaultKernel : MarshalByRefObject, IKernel, IKernelEvents, IDisposable, IKernelInternal
{
private class OptimizeDependencyResolutionDisposable : IDisposable
{
private readonly DefaultKernel kernel;
public OptimizeDependencyResolutionDisposable(DefaultKernel kernel)
{
this.kernel = kernel;
}
public void Dispose()
{
lock (kernel.handlersChangedLock) {
try {
if (kernel.handlersChanged) {
kernel.DoActualRaisingOfHandlersChanged();
kernel.RaiseRegistrationCompleted();
kernel.handlersChanged = false;
}
} finally {
kernel.handlersChangedDeferred = false;
}
}
}
}
[ThreadStatic]
private static CreationContext currentCreationContext;
[ThreadStatic]
private static bool isCheckingLazyLoaders;
private ThreadSafeFlag disposed;
private readonly List<IKernel> childKernels = new List<IKernel>();
private readonly List<IFacility> facilities = new List<IFacility>();
private readonly Dictionary<string, ISubSystem> subsystems = new Dictionary<string, ISubSystem>(StringComparer.OrdinalIgnoreCase);
private IKernel parentKernel;
private readonly object lazyLoadingLock = new object();
private readonly object handlersChangedLock = new object();
private bool handlersChanged;
private volatile bool handlersChangedDeferred;
public IComponentModelBuilder ComponentModelBuilder { get; set; }
public virtual IConfigurationStore ConfigurationStore {
get {
return GetSubSystem(SubSystemConstants.ConfigurationStoreKey) as IConfigurationStore;
}
set {
AddSubSystem(SubSystemConstants.ConfigurationStoreKey, value);
}
}
public GraphNode[] GraphNodes {
get {
GraphNode[] array = new GraphNode[NamingSubSystem.ComponentCount];
int num = 0;
IHandler[] allHandlers = NamingSubSystem.GetAllHandlers();
foreach (IHandler handler in allHandlers) {
array[num++] = handler.ComponentModel;
}
return array;
}
}
public IHandlerFactory HandlerFactory { get; set; }
public virtual IKernel Parent {
get {
return parentKernel;
}
set {
if (value == null) {
if (parentKernel != null) {
UnsubscribeFromParentKernel();
RaiseRemovedAsChildKernel();
}
parentKernel = null;
} else {
if (parentKernel != value && parentKernel != null)
throw new KernelException("You can not change the kernel parent once set, use the RemoveChildKernel and AddChildKernel methods together to achieve this.");
parentKernel = value;
SubscribeToParentKernel();
RaiseAddedAsChildKernel();
}
}
}
public IProxyFactory ProxyFactory { get; set; }
public IReleasePolicy ReleasePolicy { get; set; }
public IDependencyResolver Resolver { get; set; }
protected IConversionManager ConversionSubSystem { get; set; }
protected INamingSubSystem NamingSubSystem { get; set; }
public ILogger Logger { get; set; }
public event HandlerDelegate HandlerRegistered = delegate {
};
public event HandlersChangedDelegate HandlersChanged = delegate {
};
public event ComponentDataDelegate ComponentRegistered = delegate {
};
public event ComponentInstanceDelegate ComponentCreated = delegate {
};
public event ComponentInstanceDelegate ComponentDestroyed = delegate {
};
public event EventHandler AddedAsChildKernel = delegate {
};
public event EventHandler RegistrationCompleted = delegate {
};
public event EventHandler RemovedAsChildKernel = delegate {
};
public event ComponentModelDelegate ComponentModelCreated = delegate {
};
public event DependencyDelegate DependencyResolving = delegate {
};
public event ServiceDelegate EmptyCollectionResolving = delegate {
};
public DefaultKernel()
: this(new NotSupportedProxyFactory())
{
}
public DefaultKernel(IDependencyResolver resolver, IProxyFactory proxyFactory)
{
RegisterSubSystems();
ReleasePolicy = new LifecycledComponentsReleasePolicy(this);
HandlerFactory = new DefaultHandlerFactory(this);
ComponentModelBuilder = new DefaultComponentModelBuilder(this);
ProxyFactory = proxyFactory;
Resolver = resolver;
Resolver.Initialize(this, RaiseDependencyResolving);
if (PermissionUtil.IsGranted((IPermission)new SecurityPermission(SecurityPermissionFlag.ControlEvidence | SecurityPermissionFlag.ControlPolicy)))
Logger = new TraceLogger("Castle.Windsor", 3);
else
Logger = NullLogger.Instance;
}
public DefaultKernel(IProxyFactory proxyFactory)
: this(new DefaultDependencyResolver(), proxyFactory)
{
}
[SecurityCritical]
public DefaultKernel(SerializationInfo info, StreamingContext context)
{
MemberInfo[] serializableMembers = FormatterServices.GetSerializableMembers(GetType(), context);
object[] data = (object[])info.GetValue("members", typeof(object[]));
FormatterServices.PopulateObjectMembers(this, serializableMembers, data);
HandlerRegistered += (HandlerDelegate)info.GetValue("HandlerRegisteredEvent", typeof(Delegate));
}
[SecurityCritical]
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
MemberInfo[] serializableMembers = FormatterServices.GetSerializableMembers(GetType(), context);
object[] objectData = FormatterServices.GetObjectData(this, serializableMembers);
info.AddValue("members", objectData, typeof(object[]));
info.AddValue("HandlerRegisteredEvent", this.HandlerRegistered);
}
public virtual void Dispose()
{
if (disposed.Signal()) {
DisposeSubKernels();
TerminateFacilities();
DisposeHandlers();
DisposeComponentsInstancesWithinTracker();
UnsubscribeFromParentKernel();
}
}
public virtual void AddChildKernel(IKernel childKernel)
{
if (childKernel == null)
throw new ArgumentNullException("childKernel");
childKernel.Parent = this;
childKernels.Add(childKernel);
}
public virtual IHandler AddCustomComponent(ComponentModel model)
{
IHandler handler = ((IKernelInternal)this).CreateHandler(model);
NamingSubSystem.Register(handler);
((IKernelInternal)this).RaiseEventsOnHandlerCreated(handler);
return handler;
}
IHandler IKernelInternal.CreateHandler(ComponentModel model)
{
if (model == null)
throw new ArgumentNullException("model");
RaiseComponentModelCreated(model);
return HandlerFactory.Create(model);
}
public virtual IKernel AddFacility(IFacility facility)
{
if (facility == null)
throw new ArgumentNullException("facility");
Type facilityType = facility.GetType();
if (facilities.Any((IFacility f) => f.GetType() == facilityType))
throw new ArgumentException($"""{facilityType.FullName}""");
facilities.Add(facility);
facility.Init(this, ConfigurationStore.GetFacilityConfiguration(facility.GetType().FullName));
return this;
}
public IKernel AddFacility<T>() where T : IFacility, new
{
return AddFacility((IFacility)(object)new T());
}
public IKernel AddFacility<T>(Action<T> onCreate) where T : IFacility, new
{
T val = new T();
onCreate?.Invoke(val);
return AddFacility((IFacility)(object)val);
}
public void AddHandlerSelector(IHandlerSelector selector)
{
NamingSubSystem.AddHandlerSelector(selector);
}
public void AddHandlersFilter(IHandlersFilter filter)
{
NamingSubSystem.AddHandlersFilter(filter);
}
public virtual void AddSubSystem(string name, ISubSystem subsystem)
{
if (name == null)
throw new ArgumentNullException("name");
if (subsystem == null)
throw new ArgumentNullException("subsystem");
subsystem.Init(this);
subsystems[name] = subsystem;
if (name == SubSystemConstants.ConversionManagerKey)
ConversionSubSystem = (IConversionManager)subsystem;
else if (name == SubSystemConstants.NamingKey) {
NamingSubSystem = (INamingSubSystem)subsystem;
}
}
public virtual IHandler[] GetAssignableHandlers(Type service)
{
IHandler[] array = NamingSubSystem.GetAssignableHandlers(service);
if (Parent != null) {
IHandler[] assignableHandlers = Parent.GetAssignableHandlers(service);
if (assignableHandlers.Length != 0) {
IHandler[] array2 = new IHandler[array.Length + assignableHandlers.Length];
array.CopyTo(array2, 0);
assignableHandlers.CopyTo(array2, array.Length);
array = array2;
}
}
return array;
}
public virtual IFacility[] GetFacilities()
{
return facilities.ToArray();
}
public virtual IHandler GetHandler(string name)
{
if (name == null)
throw new ArgumentNullException("name");
IHandler handler = NamingSubSystem.GetHandler(name);
if (handler == null && Parent != null)
handler = WrapParentHandler(Parent.GetHandler(name));
return handler;
}
public virtual IHandler GetHandler(Type service)
{
if (service == (Type)null)
throw new ArgumentNullException("service");
IHandler handler = NamingSubSystem.GetHandler(service);
if (handler == null && Parent != null)
handler = WrapParentHandler(Parent.GetHandler(service));
return handler;
}
public virtual IHandler[] GetHandlers(Type service)
{
IHandler[] array = NamingSubSystem.GetHandlers(service);
if (Parent != null) {
IHandler[] handlers = Parent.GetHandlers(service);
if (handlers.Length != 0) {
IHandler[] array2 = new IHandler[array.Length + handlers.Length];
array.CopyTo(array2, 0);
handlers.CopyTo(array2, array.Length);
array = array2;
}
}
return array;
}
public virtual IHandler[] GetHandlers()
{
IHandler[] array = NamingSubSystem.GetAllHandlers();
if (Parent != null) {
IHandler[] handlers = Parent.GetHandlers();
if (handlers.Length != 0) {
IHandler[] array2 = new IHandler[array.Length + handlers.Length];
array.CopyTo(array2, 0);
handlers.CopyTo(array2, array.Length);
array = array2;
}
}
return array;
}
public virtual ISubSystem GetSubSystem(string name)
{
subsystems.TryGetValue(name, out ISubSystem value);
return value;
}
public virtual bool HasComponent(string name)
{
if (name == null)
return false;
if (NamingSubSystem.Contains(name))
return true;
if (Parent != null)
return Parent.HasComponent(name);
return false;
}
public virtual bool HasComponent(Type serviceType)
{
if (serviceType == (Type)null)
return false;
if (NamingSubSystem.Contains(serviceType))
return true;
if (Parent != null)
return Parent.HasComponent(serviceType);
return false;
}
public IKernel Register(params IRegistration[] registrations)
{
if (registrations == null)
throw new ArgumentNullException("registrations");
IDisposable disposable = OptimizeDependencyResolution();
for (int i = 0; i < registrations.Length; i++) {
registrations[i].Register(this);
}
disposable?.Dispose();
return this;
}
public virtual void ReleaseComponent(object instance)
{
if (ReleasePolicy.HasTrack(instance))
ReleasePolicy.Release(instance);
else if (Parent != null) {
Parent.ReleaseComponent(instance);
}
}
public virtual void RemoveChildKernel(IKernel childKernel)
{
if (childKernel == null)
throw new ArgumentNullException("childKernel");
childKernel.Parent = null;
childKernels.Remove(childKernel);
}
public virtual ILifestyleManager CreateLifestyleManager(ComponentModel model, IComponentActivator activator)
{
ILifestyleManager lifestyleManager;
switch (model.LifestyleType) {
case LifestyleType.Scoped:
lifestyleManager = new ScopedLifestyleManager(CreateScopeAccessor(model));
break;
case LifestyleType.Bound:
lifestyleManager = new ScopedLifestyleManager(CreateScopeAccessorForBoundLifestyle(model));
break;
case LifestyleType.Thread:
lifestyleManager = new ScopedLifestyleManager(new ThreadScopeAccessor());
break;
case LifestyleType.Transient:
lifestyleManager = new TransientLifestyleManager();
break;
case LifestyleType.Custom:
lifestyleManager = model.CustomLifestyle.CreateInstance<ILifestyleManager>(new object[0]);
break;
case LifestyleType.Pooled: {
int initialSize = ExtendedPropertiesConstants.Pool_Default_InitialPoolSize;
int maxSize = ExtendedPropertiesConstants.Pool_Default_MaxPoolSize;
if (model.ExtendedProperties.Contains(ExtendedPropertiesConstants.Pool_InitialPoolSize))
initialSize = (int)model.ExtendedProperties[ExtendedPropertiesConstants.Pool_InitialPoolSize];
if (model.ExtendedProperties.Contains(ExtendedPropertiesConstants.Pool_MaxPoolSize))
maxSize = (int)model.ExtendedProperties[ExtendedPropertiesConstants.Pool_MaxPoolSize];
lifestyleManager = new PoolableLifestyleManager(initialSize, maxSize);
break;
}
default:
lifestyleManager = new SingletonLifestyleManager();
break;
}
lifestyleManager.Init(activator, this, model);
return lifestyleManager;
}
private static IScopeAccessor CreateScopeAccessor(ComponentModel model)
{
Type scopeAccessorType = model.GetScopeAccessorType();
if (scopeAccessorType == (Type)null)
return new LifetimeScopeAccessor();
return scopeAccessorType.CreateInstance<IScopeAccessor>(new object[0]);
}
private IScopeAccessor CreateScopeAccessorForBoundLifestyle(ComponentModel model)
{
Func<IHandler[], IHandler> func = (Func<IHandler[], IHandler>)model.ExtendedProperties[Constants.ScopeRootSelector];
if (func == null)
throw new ComponentRegistrationException($"""{model.Name}""{LifestyleType.Bound}""");
return new CreationContextScopeAccessor(model, func);
}
public virtual IComponentActivator CreateComponentActivator(ComponentModel model)
{
if (model == null)
throw new ArgumentNullException("model");
if (!(model.CustomComponentActivator == (Type)null))
try {
return model.CustomComponentActivator.CreateInstance<IComponentActivator>(new object[4] {
model,
this,
new ComponentInstanceDelegate(RaiseComponentCreated),
new ComponentInstanceDelegate(RaiseComponentDestroyed)
});
} catch (Exception innerException) {
throw new KernelException("Could not instantiate custom activator", innerException);
}
return new DefaultComponentActivator(model, this, RaiseComponentCreated, RaiseComponentDestroyed);
}
protected CreationContext CreateCreationContext(IHandler handler, Type requestedType, Arguments additionalArguments, CreationContext parent, IReleasePolicy policy)
{
return new CreationContext(handler, policy, requestedType, additionalArguments, ConversionSubSystem, parent);
}
protected void DisposeHandler(IHandler handler)
{
(handler as IDisposable)?.Dispose();
}
void IKernelInternal.RaiseEventsOnHandlerCreated(IHandler handler)
{
RaiseHandlerRegistered(handler);
RaiseHandlersChanged();
RaiseComponentRegistered(handler.ComponentModel.Name, handler);
}
protected virtual void RegisterSubSystems()
{
AddSubSystem(SubSystemConstants.ConfigurationStoreKey, new DefaultConfigurationStore());
AddSubSystem(SubSystemConstants.ConversionManagerKey, new DefaultConversionManager());
AddSubSystem(SubSystemConstants.NamingKey, new DefaultNamingSubSystem());
AddSubSystem(SubSystemConstants.ResourceKey, new DefaultResourceSubSystem());
AddSubSystem(SubSystemConstants.DiagnosticsKey, new DefaultDiagnosticsSubSystem());
}
protected object ResolveComponent(IHandler handler, Type service, Arguments additionalArguments, IReleasePolicy policy)
{
return ResolveComponent(handler, service, additionalArguments, policy, false);
}
private object ResolveComponent(IHandler handler, Type service, Arguments additionalArguments, IReleasePolicy policy, bool ignoreParentContext)
{
CreationContext creationContext = currentCreationContext;
CreationContext context = currentCreationContext = CreateCreationContext(handler, service, additionalArguments, ignoreParentContext ? null : creationContext, policy);
try {
return handler.Resolve(context);
} finally {
currentCreationContext = creationContext;
}
}
protected virtual IHandler WrapParentHandler(IHandler parentHandler)
{
if (parentHandler == null)
return null;
ParentHandlerWrapper parentHandlerWrapper = new ParentHandlerWrapper(parentHandler, Parent.Resolver, Parent.ReleasePolicy);
parentHandlerWrapper.Init(this);
return parentHandlerWrapper;
}
private void DisposeComponentsInstancesWithinTracker()
{
ReleasePolicy.Dispose();
}
private void DisposeHandlers()
{
IVertex[] graphNodes = GraphNodes;
IVertex[] array = TopologicalSortAlgo.Sort(graphNodes);
for (int i = 0; i < array.Length; i++) {
ComponentModel componentModel = (ComponentModel)array[i];
IHandler handler = NamingSubSystem.GetHandler(componentModel.Name);
DisposeHandler(handler);
}
}
private void DisposeSubKernels()
{
foreach (IKernel childKernel in childKernels) {
childKernel.Dispose();
}
}
private void HandlerRegisteredOnParentKernel(IHandler handler, ref bool stateChanged)
{
RaiseHandlerRegistered(handler);
}
private void HandlersChangedOnParentKernel(ref bool changed)
{
RaiseHandlersChanged();
}
private void SubscribeToParentKernel()
{
if (parentKernel != null) {
parentKernel.HandlerRegistered += this.HandlerRegisteredOnParentKernel;
parentKernel.HandlersChanged += this.HandlersChangedOnParentKernel;
parentKernel.ComponentRegistered += RaiseComponentRegistered;
}
}
private void TerminateFacilities()
{
foreach (IFacility facility in facilities) {
facility.Terminate();
}
}
private void UnsubscribeFromParentKernel()
{
if (parentKernel != null) {
parentKernel.HandlerRegistered -= this.HandlerRegisteredOnParentKernel;
parentKernel.HandlersChanged -= this.HandlersChangedOnParentKernel;
parentKernel.ComponentRegistered -= RaiseComponentRegistered;
}
}
IHandler IKernelInternal.LoadHandlerByName(string name, Type service, Arguments arguments)
{
if (name == null)
throw new ArgumentNullException("name");
IHandler handler = GetHandler(name);
if (handler != null)
return handler;
lock (lazyLoadingLock) {
handler = GetHandler(name);
if (handler == null) {
if (!isCheckingLazyLoaders) {
isCheckingLazyLoaders = true;
try {
ILazyComponentLoader[] array = ResolveAll<ILazyComponentLoader>();
for (int i = 0; i < array.Length; i++) {
IRegistration registration = array[i].Load(name, service, arguments);
if (registration != null) {
registration.Register(this);
return GetHandler(name);
}
}
return null;
} finally {
isCheckingLazyLoaders = false;
}
}
return null;
}
return handler;
}
}
IHandler IKernelInternal.LoadHandlerByType(string name, Type service, Arguments arguments)
{
if (service == (Type)null)
throw new ArgumentNullException("service");
IHandler handler = GetHandler(service);
if (handler != null)
return handler;
lock (lazyLoadingLock) {
handler = GetHandler(service);
if (handler == null) {
if (!isCheckingLazyLoaders) {
isCheckingLazyLoaders = true;
try {
ILazyComponentLoader[] array = ResolveAll<ILazyComponentLoader>();
for (int i = 0; i < array.Length; i++) {
IRegistration registration = array[i].Load(name, service, arguments);
if (registration != null) {
registration.Register(this);
return GetHandler(service);
}
}
return null;
} finally {
isCheckingLazyLoaders = false;
}
}
return null;
}
return handler;
}
}
[SecurityCritical]
public override object InitializeLifetimeService()
{
return null;
}
public IDisposable OptimizeDependencyResolution()
{
if (handlersChangedDeferred)
return null;
handlersChangedDeferred = true;
return new OptimizeDependencyResolutionDisposable(this);
}
protected virtual void RaiseAddedAsChildKernel()
{
this.AddedAsChildKernel(this, EventArgs.Empty);
}
protected virtual void RaiseComponentCreated(ComponentModel model, object instance)
{
this.ComponentCreated(model, instance);
}
protected virtual void RaiseComponentDestroyed(ComponentModel model, object instance)
{
this.ComponentDestroyed(model, instance);
}
protected virtual void RaiseComponentModelCreated(ComponentModel model)
{
this.ComponentModelCreated(model);
}
protected virtual void RaiseComponentRegistered(string key, IHandler handler)
{
this.ComponentRegistered(key, handler);
}
protected virtual void RaiseDependencyResolving(ComponentModel client, DependencyModel model, object dependency)
{
this.DependencyResolving(client, model, dependency);
}
protected virtual void RaiseHandlerRegistered(IHandler handler)
{
bool stateChanged = true;
while (stateChanged) {
stateChanged = false;
this.HandlerRegistered(handler, ref stateChanged);
}
}
protected virtual void RaiseHandlersChanged()
{
if (handlersChangedDeferred) {
lock (handlersChangedLock) {
handlersChanged = true;
}
} else
DoActualRaisingOfHandlersChanged();
}
protected virtual void RaiseRegistrationCompleted()
{
this.RegistrationCompleted(this, EventArgs.Empty);
}
protected virtual void RaiseRemovedAsChildKernel()
{
this.RemovedAsChildKernel(this, EventArgs.Empty);
}
private void DoActualRaisingOfHandlersChanged()
{
bool stateChanged = true;
while (stateChanged) {
stateChanged = false;
this.HandlersChanged(ref stateChanged);
}
}
public virtual object Resolve(string key, Type service)
{
return ((IKernelInternal)this).Resolve(key, service, (Arguments)null, ReleasePolicy);
}
public virtual object Resolve(string key, Type service, Arguments arguments)
{
return ((IKernelInternal)this).Resolve(key, service, arguments, ReleasePolicy);
}
public T Resolve<T>(Arguments arguments)
{
return (T)Resolve(typeof(T), arguments);
}
public T Resolve<T>()
{
return (T)Resolve(typeof(T), null);
}
public T Resolve<T>(string key)
{
return (T)((IKernelInternal)this).Resolve(key, typeof(T), (Arguments)null, ReleasePolicy);
}
public T Resolve<T>(string key, Arguments arguments)
{
return (T)((IKernelInternal)this).Resolve(key, typeof(T), arguments, ReleasePolicy);
}
public object Resolve(Type service)
{
return ((IKernelInternal)this).Resolve(service, (Arguments)null, ReleasePolicy, false);
}
public object Resolve(Type service, Arguments arguments)
{
return ((IKernelInternal)this).Resolve(service, arguments, ReleasePolicy, false);
}
public Array ResolveAll(Type service)
{
return ((IKernelInternal)this).ResolveAll(service, (Arguments)null, ReleasePolicy);
}
public Array ResolveAll(Type service, Arguments arguments)
{
return ((IKernelInternal)this).ResolveAll(service, arguments, ReleasePolicy);
}
public TService[] ResolveAll<TService>(Arguments arguments)
{
return (TService[])((IKernelInternal)this).ResolveAll(typeof(TService), arguments, ReleasePolicy);
}
public TService[] ResolveAll<TService>()
{
return (TService[])((IKernelInternal)this).ResolveAll(typeof(TService), (Arguments)null, ReleasePolicy);
}
object IKernelInternal.Resolve(string key, Type service, Arguments arguments, IReleasePolicy policy)
{
IHandler handler = ((IKernelInternal)this).LoadHandlerByName(key, service, arguments);
if (handler == null) {
int countOfHandlersForTheService = GetHandlers(service).Length;
throw new ComponentNotFoundException(key, service, countOfHandlersForTheService);
}
return ResolveComponent(handler, service ?? typeof(object), arguments, policy);
}
object IKernelInternal.Resolve(Type service, Arguments arguments, IReleasePolicy policy, bool ignoreParentContext)
{
IHandler handler = ((IKernelInternal)this).LoadHandlerByType((string)null, service, arguments);
if (handler == null)
throw new ComponentNotFoundException(service);
return ResolveComponent(handler, service, arguments, policy, ignoreParentContext);
}
Array IKernelInternal.ResolveAll(Type service, Arguments arguments, IReleasePolicy policy)
{
List<object> list = new List<object>();
IHandler[] handlers = GetHandlers(service);
foreach (IHandler handler in handlers) {
if (!handler.IsBeingResolvedInContext(currentCreationContext))
try {
object item = ResolveComponent(handler, service, arguments, policy);
list.Add(item);
} catch (GenericHandlerTypeMismatchException) {
}
}
if (list.Count == 0)
this.EmptyCollectionResolving(service);
Array array = Array.CreateInstance(service, list.Count);
((ICollection)list).CopyTo(array, 0);
return array;
}
}
}