Autofac一款IOC容器,听说比Spring.Net、Unity、Castle性能高,且比较轻量级,也有人作过测试,本身能够找找,看看比拼的结果是怎样的,在使用Autofac以前咱们先来了解几个概念;在我看来依赖倒置(DIP)、控制反转(IOC)、 依赖注入(DI),都源于一个思想,一项技术,思想就是面向接口编程,技术就是反射。html
一般咱们在编程的时候呢,类与类之间都有着这样那样的关系,没有关系的类,也就说明它没有存在的必要了;那么对于复杂的系统来说,类之间的关系也会变的更复杂,若是需求发生变化,那将是改死人的节奏,那么如何下降依赖关系,提升系统的扩展性,就很是重要了,也就是咱们常常说的解耦。mysql
依赖倒置原则:sql
上层是使用者,下层是被使用者,若是下层发生变化那么上层也要进行修改,那么该怎么办呢,就是上层和下层共同依赖于一个抽象,那么抽象是稳定的,上层也就不须要修改了。编程
一般咱们在编程的时候,都是使用者须要什么对象就实例化一个对象,如今有这么一个场景,好比咱们的系统以前用的是SqlServer,如今须要也支持MySql,那么业务逻辑层也须要改动不少。json
如今利用控制反转咱们能够将实例化对象交给IOC容器来实现,这样使用者就不须要改动了,用一句话来总结就是:api
使用者再也不实例化被使用者对象,而交给IOC容器来实现框架
就是由IoC容器在运行期间,动态地将某种依赖关系注入到对象之中。函数
这些概念已经有不少文章了,不了解的童鞋能够移步这里http://www.cnblogs.com/qqlin/archive/2012/10/09/2707075.htmlsqlserver
那么咱们该如何使用这款轻量级且高效的框架呢,本文示例使用的是Autofac 4.2.0版本,上代码post
首先须要经过nuget安装Autofac和Autofac.Configuration组件
/// <summary> /// 数据访问接口 /// </summary> public interface IDataAccess { string GetData(); } /// <summary> /// 从sqlserver获取接口 /// </summary> public class SqlServer : IDataAccess { public string GetData() { return "从sqlserver获取数据"; } } /// <summary> /// 从Mysql获取数据 /// </summary> public class MySql : IDataAccess { public string GetData() { return "从mysql获取数据"; } } /// <summary> /// 数据源管理类 /// </summary> public class DBBase { IDataAccess _access; /// <summary> /// 根据传入的类型动态建立对象 /// </summary> /// <param name="access"></param> public DBBase(IDataAccess access) { _access = access; } public string GetData() { return _access.GetData(); } }
var builder = new ContainerBuilder(); #region 构造函数注入 //经过autofac api注册组件 //注册DbBase类型 builder.RegisterType<DBBase>(); //注册类型并指定使用哪一个构造函数 //builder.RegisterType<DBBase>().UsingConstructor(); //注册类型及其实例,注册接口IDataAccess的实例SqlServer builder.RegisterType<SqlServer>().As<IDataAccess>(); #region 为一个接口注册多个不一样实例 //builder.RegisterType<SqlServer>().Named<IDataAccess>("SqlServer"); //builder.RegisterType<MySql>().Named<IDataAccess>("Mysql"); //使用这种方式注册时,在实例化对象的时候须要使用 //container.ResolveNamed<IDataAccess>("SqlServer") #endregion #region 使用XML文件注册组件 //使用以前先在NuGet中安装Microsoft.Extensions.Configuration.Xml才能使用AddXmlFile方法 var config = new ConfigurationBuilder(); config.AddXmlFile("config/autofac.xml", false); var module = new ConfigurationModule(config.Build()); builder.RegisterModule(module); //若是文件路径找不到的话能够用//config.SetBasePath(directory.Parent.Parent.FullName);来设置配置文件所在目录 #endregion #region 使用JSON文件注册组件 //在NuGet中安装Microsoft.Extensions.Configuration.Json才能使用AddJsonFile方法 var config = new ConfigurationBuilder(); config.SetBasePath(directory.Parent.Parent.FullName); config.AddJsonFile("config/autofac.json"); var module = new ConfigurationModule(config.Build()); builder.RegisterModule(module); #endregion #endregion //构建IOC容器 using (var container = builder.Build()) { var access = container.Resolve<DBBase>(); Console.WriteLine(access.GetData()); } Console.Read();
所用到的配置文件以下:
config/autofac.xml
<?xml version="1.0" encoding="utf-8" ?> <!--defaultAssembly 默认的命名空间;若是type节点或者services节点的属性type没有设置类所在命名空间的话,将默认在defaultAssembly下查找类,type节点和services节点的属性type设置格式为MyType,MyAssembly".--> <autofac defaultAssembly="AutofacDemo"> <components name="0"> <type>AutofacDemo.MySql,AutofacDemo</type> <services name="0" type="AutofacDemo.IDataAccess,AutofacDemo" /> <injectProperties>true</injectProperties> <!--是否启用组件的属性注入--> </components> </autofac>
config/autofac.json
{
"defaultAssembly": "AutofacDemo",
"components": [
{
"type": "AutofacDemo.SqlServer,AutofacDemo",
"services": [
{
"type": "AutofacDemo.IDataAccess,AutofacDemo"
}
],
"injectProperties": true
}
]
}
json配置文件和xml配置文件的节点用途都是同样的,另外还有属性注入和方法两种模式,感兴趣的能够自行研究。