http://blog.csdn.net/liuweitoo/article/details/8290966
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