ThreadScopeAccessor
using Castle.Core.Internal;
using Castle.MicroKernel.Context;
using Castle.MicroKernel.Lifestyle.Scoped;
using System;
using System.Linq;
using System.Threading;
namespace Castle.MicroKernel.Lifestyle
{
    [Serializable]
    public class ThreadScopeAccessor : IScopeAccessor, IDisposable
    {
        private readonly SimpleThreadSafeDictionary<int, ILifetimeScope> items = new SimpleThreadSafeDictionary<int, ILifetimeScope>();
        public void Dispose()
        {
            foreach (ILifetimeScope item in items.EjectAllValues().Reverse()) {
                item.Dispose();
            }
        }
        public ILifetimeScope GetScope(CreationContext context)
        {
            int currentThreadId = GetCurrentThreadId();
            return items.GetOrAdd(currentThreadId, (int id) => new DefaultLifetimeScope(null, null));
        }
        protected virtual int GetCurrentThreadId()
        {
            return Thread.CurrentThread.ManagedThreadId;
        }
    }
}