zoukankan      html  css  js  c++  java
  • 多个IoC容器适配器设计及性能测试(Castle.Windsor Autofac Spring.Core)

    [转]多个IoC容器适配器设计及性能测试和容器选择

    1. 采用的IoC容器和版本

    Autofac.2.6.3.862

    Castle.Windsor.3.1.0

    Spring.Core.2.0.0

    2. 基础类库:服务类库和组件类库及相关的辅助类库

    辅助类库:Demo.Common.dll

    服务接口类库:Demo.Lib.dll

    Oracle组件类库:Demo.Lib.Oracle.dll

    Sql组件类库:Demo.Lib.Sql.dll

    3. Autofac容器适配器

    using Autofac;
    
    using System;
    
    namespace IoC.Core.Adapter
    {
        public sealed class AutofacContainerAdapter : IContainerAdapter
        {
            public AutofacContainerAdapter()
            {
                Prepare();
            }
            private IContainer container;
    
    
            public void Prepare()
            {
                var autofacContainerBuilder = new ContainerBuilder();
                
                //autofacContainerBuilder.RegisterType<Singleton>()
                //        .As<ISingleton>()
                //        .SingleInstance();
    
                //autofacContainerBuilder.RegisterType<Transient>()
                //        .As<ITransient>();
    
                //autofacContainerBuilder.RegisterType<Combined>()
                //        .As<ICombined>();
    
                this.container = autofacContainerBuilder.Build();
            }
    
            public T Resolve<T>()
            {
                return this.container.Resolve<T>();
            }
    
    
            public T Resolve<T>(string ServiceName)
            {
                return this.container.ResolveNamed<T>(ServiceName);
            }
    
    
            public void Dispose()
            {
                // Allow the container and everything it references to be disposed.
                this.container = null;
            }
    
            public void Register(Type TService, Type TImplementation, string ServiceName, LifeCycleType LifeCycle = LifeCycleType.Transient)
            {
                if (!string.IsNullOrEmpty(ServiceName) && !container.IsRegisteredWithName(ServiceName, TService))
                {
                    var autofacContainerBuilder = new ContainerBuilder();
    
                    var item = autofacContainerBuilder.RegisterType(TImplementation);
    
                    if (!string.IsNullOrEmpty(ServiceName))
                    {
                        item = item.Named(ServiceName, TService);
                    }
                    else
                    {
                        item = item.As(TService);
                    }
    
    
    
                    switch (LifeCycle)
                    {
                        case LifeCycleType.Singleton:
                            item = item.SingleInstance();
                            break;
                        case LifeCycleType.Transient:
                            item = item.InstancePerDependency();
                            break;
                        case LifeCycleType.Request:
                            item = item.InstancePerLifetimeScope();
                            break;
                    }
    
    
                    
    
                    //if (!string.IsNullOrEmpty(ServiceName))
                    //{
                    //    autofacContainerBuilder.RegisterType(TImplementation).Named(ServiceName, TService);
                    //}
                    //else
                    //{
                    //    autofacContainerBuilder.RegisterType(TImplementation).As(TService);
                    //}
    
                    //container = autofacContainerBuilder.Build();
                    autofacContainerBuilder.Update(container);
                }
            }
    
    
            public void Register(string TServiceFull, string TImplementationFull, string ServiceName, LifeCycleType LifeCycle = LifeCycleType.Transient)
            {
                Type TService = Type.GetType(TServiceFull);
                Type TImplementation = Type.GetType(TImplementationFull);
    
                if (!string.IsNullOrEmpty(ServiceName) && !container.IsRegisteredWithName(ServiceName, TService))
                {
                    Register(TService, TImplementation, ServiceName, LifeCycle);
                }
    
            }
    
    
            public void Register(Type TService, Type TImplementation, LifeCycleType LifeCycle)
            {
                string ServiceName = TImplementation.GetType().Name;
                Register(TService, TImplementation, ServiceName, LifeCycle);
            }
    
            public void Register(string TServiceFull, string TImplementationFull, LifeCycleType LifeCycle)
            {
                if (!string.IsNullOrEmpty(TImplementationFull))
                {
                    string ServiceName = TImplementationFull;
                    if (TImplementationFull.IndexOf(",") > 0)
                    {
                        ServiceName = TImplementationFull.Substring(0, TImplementationFull.IndexOf(","));
                    }
                    Register(TServiceFull, TImplementationFull, ServiceName, LifeCycle);
                }
            }
    
    
    
    
        }
    }


     

    4. Castle.Windsor容器适配器

    using Castle.MicroKernel.Registration;
    using Castle.Windsor;
    
    using System;
    using System.Collections.Generic;
    
    namespace IoC.Core.Adapter
    {
        public sealed class WindsorContainerAdapter : IContainerAdapter
        {
            public WindsorContainerAdapter()
            {
                Prepare();
            }
            private WindsorContainer container;
    
            public void Prepare()
            {
                this.container = new WindsorContainer();
    
                //this.container.Register(Component.For<ISingleton>().ImplementedBy<Singleton>());
                //this.container.Register(Component.For<ITransient>().ImplementedBy<Transient>().LifeStyle.Transient);
                //this.container.Register(Component.For<ICombined>().ImplementedBy<Combined>().LifeStyle.Transient);
            }
    
            public T Resolve<T>()
            {
                return this.container.Resolve<T>();
            }
    
            public T Resolve<T>(string ServiceName)
            {
    
                return this.container.Resolve<T>(ServiceName);
            }
    
    
            public void Dispose()
            {
                // Allow the container and everything it references to be disposed.
                this.container = null;
            }
    
            private IDictionary<string, string> NameDict = new Dictionary<string, string>();
    
            public void Register(Type TService, Type TImplementation, string ServiceName, LifeCycleType LifeCycle = LifeCycleType.Transient)
            {
                if (!string.IsNullOrEmpty(ServiceName) && !NameDict.ContainsKey(ServiceName))
                {
                    var item = Component.For(TService).ImplementedBy(TImplementation);
    
                    switch (LifeCycle)
                    {
                        case LifeCycleType.Singleton:
                            item = item.LifestyleSingleton();
                            break;
                        case LifeCycleType.Transient:
                            item = item.LifestyleTransient();
                            break;
                        case LifeCycleType.Request:
                            item = item.LifestylePerWebRequest();
                            break;
                    }
    
                    if (!string.IsNullOrEmpty(ServiceName))
                    {
                        item = item.Named(ServiceName);
                        NameDict[ServiceName] = null;
                    }
    
                    container.Register(item);
    
                }
    
            }
    
            public void Register(string TServiceFull, string TImplementationFull, string ServiceName, LifeCycleType LifeCycle = LifeCycleType.Transient)
            {
                if (!string.IsNullOrEmpty(ServiceName) && !NameDict.ContainsKey(ServiceName))
                {
    
                    Type TService = Type.GetType(TServiceFull);
                    Type TImplementation = Type.GetType(TImplementationFull);
    
                    Register(TService, TImplementation, ServiceName, LifeCycle);
    
    
                }
    
            }
    
    
    
            public void Register(Type TService, Type TImplementation, LifeCycleType LifeCycle)
            {
                string ServiceName = TImplementation.GetType().Name;
                Register(TService, TImplementation, ServiceName, LifeCycle);
            }
    
            public void Register(string TServiceFull, string TImplementationFull, LifeCycleType LifeCycle)
            {
                if (!string.IsNullOrEmpty(TImplementationFull))
                {
                    string ServiceName = TImplementationFull;
                    if (TImplementationFull.IndexOf(",") > 0)
                    {
                        ServiceName = TImplementationFull.Substring(0, TImplementationFull.IndexOf(","));
                    }
                    Register(TServiceFull, TImplementationFull, ServiceName, LifeCycle);
                }
            }
    
        }
    }


     

    5. Spring.NET的容器适配器

    using Spring.Core;
    using Spring.Context;
    using Spring.Context.Support;
    using Spring.Objects.Factory.Support;
    
    using System;
    
    namespace IoC.Core.Adapter
    {
        public sealed class SpringContainerAdapter : IContainerAdapter
        {
            public SpringContainerAdapter()
            {
                Prepare();
            }
    
            private GenericApplicationContext container;
    
            public void Prepare()
            {
                //this.container = Spring.Context.Support.ContextRegistry.GetContext();
                container = new GenericApplicationContext();
            }
    
            public T Resolve<T>()
            {
                return (T)container.GetObject(typeof(T).FullName);
            }
    
            public T Resolve<T>(string ServiceName)
            {
                return (T)container.GetObject<T>(ServiceName);
            }
    
    
    
            public void Dispose()
            {
                // Allow the container and everything it references to be disposed.
                this.container = null;
            }
    
    
            public void Register(Type TService, Type TImplementation, string ServiceName, LifeCycleType LifeCycle = LifeCycleType.Transient)
            {
    
                if (!string.IsNullOrEmpty(ServiceName) && !container.IsObjectNameInUse(ServiceName))
                {
                    string vName = TImplementation.GetType().ToString();
                    string TImplementationFull = vName + ", " + TImplementation.Assembly.ToString();
                    IObjectDefinitionFactory factory = new DefaultObjectDefinitionFactory();
                    AbstractObjectDefinition defi = factory.CreateObjectDefinition(TImplementationFull, null, AppDomain.CurrentDomain);
    
                    string SpringObjeLifeCycle = "singleton";//"prototype" "request";
                    switch (LifeCycle)
                    {
                        case LifeCycleType.Singleton:
                            SpringObjeLifeCycle = "singleton";
                            break;
                        case LifeCycleType.Transient:
                            SpringObjeLifeCycle = "prototype";
                            break;
                        case LifeCycleType.Request:
                            SpringObjeLifeCycle = "request";
                            break;
                    }
                    defi.Scope = SpringObjeLifeCycle;
    
                    //建立容器  
                    //GenericApplicationContext tmpContainer = container as GenericApplicationContext;
                    container.RegisterObjectDefinition(ServiceName, defi);
    
                }
    
            }
    
            public void Register(string TServiceFull, string TImplementationFull, string ServiceName, LifeCycleType LifeCycle = LifeCycleType.Transient)
            {
                if (!string.IsNullOrEmpty(ServiceName) && !container.IsObjectNameInUse(ServiceName))
                {
    
                    IObjectDefinitionFactory factory = new DefaultObjectDefinitionFactory();
                    AbstractObjectDefinition defi = factory.CreateObjectDefinition(TImplementationFull, null, AppDomain.CurrentDomain);
    
                    string SpringObjeLifeCycle = "singleton";//"prototype" "request";
                    switch (LifeCycle)
                    {
                        case LifeCycleType.Singleton:
                            SpringObjeLifeCycle = "singleton";
                            break;
                        case LifeCycleType.Transient:
                            SpringObjeLifeCycle = "prototype";
                            break;
                        case LifeCycleType.Request:
                            SpringObjeLifeCycle = "request";
                            break;
                    }
                    defi.Scope = SpringObjeLifeCycle;
    
                    string vFullName = Type.GetType(TImplementationFull).FullName;
                    //建立容器  
                    //GenericApplicationContext tmpContainer = container as GenericApplicationContext;
                    container.RegisterObjectDefinition(vFullName, defi);
                }
    
            }
    
    
            public void Register(Type TService, Type TImplementation, LifeCycleType LifeCycle)
            {
                string ServiceName = TImplementation.GetType().Name;
                Register(TService, TImplementation, ServiceName, LifeCycle);
            }
    
            public void Register(string TServiceFull, string TImplementationFull, LifeCycleType LifeCycle)
            {
                if (!string.IsNullOrEmpty(TImplementationFull))
                {
                    string ServiceName = TImplementationFull;
                    if (TImplementationFull.IndexOf(",") > 0)
                    {
                        ServiceName = TImplementationFull.Substring(0, TImplementationFull.IndexOf(","));
                    }
                    Register(TServiceFull, TImplementationFull, ServiceName, LifeCycle);
                }
            }
        }
    }


     

    6. 测试结果

    6.1. 单例模式

    6.2. 瞬时(多例)模式

    7. 测试结论

    (1) 不管是单例还是多例,初始化的时间都差不多,Autofac略快

     Autofac略快
     Spring和Windsor略慢,但两者相差不大


    (2) 不管是单例还是多例,非初始化取数据时,取数据量大时,花费的时间也大


    (3) 单例时,性能比较,Autofac略慢,但差异不大


     Spring和Windsor花费时间差不多
     Autofac比较慢


    (4) 多例时,性能比较,Autofac速度最快,也最稳定,差异较大


     Autofac速度最快,相当稳定
     Windsor速度居中:是Autofac的1~2倍
     Spring速度最慢: 是Autofac的5~6倍左右

    8. IoC容器选择结论(Autofac第一名)


     A. 单例时,Autofac会略慢,但相差不大


     B. 多例时,Autofac速度明显较快,Spring性能下降太厉害


     C. 整体而言,Autofac的优劣较明显


     D. 性能对比,Autofac > Windsor > Spring

    9. Demo下载

    点此下载

  • 相关阅读:
    zoj 3627#模拟#枚举
    Codeforces 432D Prefixes and Suffixes kmp
    hdu 4778 Gems Fight! 状压dp
    CodeForces 379D 暴力 枚举
    HDU 4022 stl multiset
    手动转一下田神的2048
    【ZOJ】3785 What day is that day? ——KMP 暴力打表找规律
    poj 3254 状压dp
    C++中运算符的优先级
    内存中的数据对齐
  • 原文地址:https://www.cnblogs.com/xdot/p/7340212.html
Copyright © 2011-2022 走看看