多个IoC容器适配器设计及性能测试(Castle.Windsor Autofac Spring.Core)
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下载
多个IoC容器适配器设计及性能测试(Castle.Windsor Autofac Spring.Core)的更多相关文章
- Spring源码解析-ioc容器的设计
Spring源码解析-ioc容器的设计 1 IoC容器系列的设计:BeanFactory和ApplicatioContext 在Spring容器中,主要分为两个主要的容器系列,一个是实现BeanFac ...
- Spring源码阅读:IOC容器的设计与实现(二)——ApplicationContext
上一主题(查看)中,了解了IOC容器的基本概念,以及BeanFactory的设计与实现方式,这里就来了解一下ApplicationContext方式的实现. ApplicationContext 在S ...
- Spring IoC容器的设计——BeanFactory应用场景2
1.BeanFactory接口设计了getBean方法,这个方法是使用IoC容器API的主要方法,通过这个方法,可以取得IoC容器中管理的Bean,Bean的取得是通过指定名字来索引的. 2.如果需要 ...
- Spring IoC容器的设计——BeanFactory应用场景
1.BeanFactory提供的是最基本的IoC容器的功能,关于这些功能定义,我们可以在接口BeanFatory中看到. 2.BeanFactory接口定义了IoC容器最基本的容器的形式,并且提供了I ...
- Spring IoC容器的设计—3—次线
这里涉及的是主要接口关系,而具体的IoC容器都是在这个接口体系下实现的,比如DefaultListableBeanFactory,这个基本IoC容器的实现就是实现了ConfigurableBeanFa ...
- Spring IoC容器的设计—2—主线
第二条接口设计主线是,以ApplicationContext应用上下文接口为核心的接口设计,这里涉及的主要接口设计有,从BeanFactory到ListableBeanFactory,再到Applic ...
- Spring IoC容器的设计—1—主线
IoC容器的接口设计图 下面对接口关系做一些简要的分析,可以依据以下内容来理解这张接口设计图. 从接口BeanFactory到HierarchicalBeanFactory,再到Configurabl ...
- Spring IoC容器与应用上下文的设计与实现
一.前言 写这篇博文的主要目的如下: 通过相关类和接口分析IoC容器到底长什么样. 阐述笔者对Spring上下文和容器的理解. 介绍重要的类辅助理解SpringBoot的启动流程. 二.Spring ...
- BeanFactory容器的设计原理
XmlBeanFactory设计的类继承关系 1.BeanFactory接口提供了使用IoC容器的规范.在这个基础上,Spring还提供了符合这个IoC容器接口的一系列容器的实现供开发人员使用. 2. ...
随机推荐
- c++11并发机制
传统意义上OS提供的并发机制包含进程和线程两个级别.考虑到实际复杂性,c++11仅提供了线程并发机制. c++11提供的线程并发机制主要位于四个头文件中:..... 线程并发机制包括线程管理.原子操作 ...
- LeetCode: Path Sum 解题报告
Path Sum Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that addi ...
- LeetCode: Add Two Numbers 解题报告
Add Two NumbersYou are given two linked lists representing two non-negative numbers. The digits are ...
- Win8常用快捷键
Windows 8中常用的快捷键 Windows 键 可在开始屏幕主菜单及最后一个应用程序间循环切换 Windows 键 + C 打开“超级按钮” Windows 键 + I 打开当前程序的“设置”菜 ...
- C#学习笔记(17)——C#中接口的作用
说明(2017-7-17 23:50:48): 原文: 接口的作用 接口的作用(C#)(另一篇) C#接口是一个让很多初学C#者容易迷糊的东西,用起来好像很简单,定义接口,里面包含方法,但没有方法具体 ...
- C++中的new、operator new与placement new
转:http://www.cnblogs.com/luxiaoxun/archive/2012/08/10/2631812.html new/delete与operator new/operator ...
- C# using关键字 --转
其实对于.NET的学习者一开始都接触using这个关键字了,可能大家没有怎么在意,包括我本人也是的,直到今天有人问我using的作用时,才引起了我的注意. 概况来说可以分为两种:第一种,就 ...
- 未能加载文件或程序集“System.Web.Mvc, Version=3.0.0.0,
直接下载安装 ASP.NET MVC 3.0就可以了
- MYSQL自动备份策略的选择与实践
目前流行几种备份方式: 1.逻辑备份:使用mysql自带的mysqldump工具进行备份.备份成sql文件形式.优点:最大好处是能够与正在运行的mysql自动协同工作,在运行期间可以确保备份是当时的点 ...
- 【Unity】自定义编辑器窗口——拓展编辑器功能
最近学习了Unity自定义编辑器窗口,下面简单总结,方便用到时回顾. 新建一个脚本: using UnityEngine; using System.Collections; using UnityE ...