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下载

    点此下载

  • 相关阅读:
    Loadrunner 参数化&参数化策略&参数化mysql
    Loadrunner 录制脚本注意事项
    Centos7卸载nginx及php、php-fpm方法
    卸载apache
    apache配置
    centOs
    ajax-php跨域请求
    安装php
    apache
    java集合类,HashMap,ArrayList
  • 原文地址:https://www.cnblogs.com/xdot/p/7340212.html
Copyright © 2011-2022 走看看