using System; using System.Collections.Generic; using System.Linq; namespace Abp.Dependency { public class ScopedIocResolver : IScopedIocResolver { private readonly IIocResolver _iocResolver; private readonly List _resolvedObjects; public ScopedIocResolver(IIocResolver iocResolver) { _iocResolver = iocResolver; _resolvedObjects = new List(); } public T Resolve() { return Resolve(typeof(T)); } public T Resolve(Type type) { return (T)Resolve(type); } public T Resolve(object argumentsAsAnonymousType) { return (T)Resolve(typeof(T), argumentsAsAnonymousType); } public object Resolve(Type type) { return Resolve(type, null); } public object Resolve(Type type, object argumentsAsAnonymousType) { var resolvedObject = argumentsAsAnonymousType != null ? _iocResolver.Resolve(type, argumentsAsAnonymousType) : _iocResolver.Resolve(type); _resolvedObjects.Add(resolvedObject); return resolvedObject; } public T[] ResolveAll() { return ResolveAll(typeof(T)).OfType().ToArray(); } public T[] ResolveAll(object argumentsAsAnonymousType) { return ResolveAll(typeof(T), argumentsAsAnonymousType).OfType().ToArray(); } public object[] ResolveAll(Type type) { return ResolveAll(type, null); } public object[] ResolveAll(Type type, object argumentsAsAnonymousType) { var resolvedObjects = argumentsAsAnonymousType != null ? _iocResolver.ResolveAll(type, argumentsAsAnonymousType) : _iocResolver.ResolveAll(type); _resolvedObjects.AddRange(resolvedObjects); return resolvedObjects; } public void Release(object obj) { _resolvedObjects.Remove(obj); _iocResolver.Release(obj); } public bool IsRegistered(Type type) { return _iocResolver.IsRegistered(type); } public bool IsRegistered() { return IsRegistered(typeof(T)); } public void Dispose() { _resolvedObjects.ForEach(_iocResolver.Release); } } }