AutoFac使用~IOC容器(DIP,IOC,DI)
来源:互联网 发布:淘宝上的古着能买吗 编辑:程序博客网 时间:2024/04/30 04:29
Autofac一款IOC容器,据说比Spring.Net、Unity、Castle性能高,且比较轻量级,也有人做过测试,自己可以找找,看看比拼的结果是怎样的,在使用Autofac之前我们先来了解几个概念;在我看来依赖倒置(DIP)、控制反转(IOC)、 依赖注入(DI),都源于一个思想,一项技术,思想就是面向接口编程,技术就是反射。
通常我们在编程的时候呢,类与类之间都有着这样那样的关系,没有关系的类,也就说明它没有存在的必要了;那么对于复杂的系统来讲,类之间的关系也会变的更复杂,如果需求发生变化,那将是改死人的节奏,那么如何降低依赖关系,提高系统的扩展性,就非常重要了,也就是我们经常说的解耦。
依赖倒置
依赖倒置原则:
- 上层模块不应该依赖下层模块,它们共同依赖于抽象
- 抽象不依赖于具象,具象依赖抽象
上层是使用者,下层是被使用者,如果下层发生变化那么上层也要进行修改,那么该怎么办呢,就是上层和下层共同依赖于一个抽象,那么抽象是稳定的,上层也就不需要修改了。
控制反转
通常我们在编程的时候,都是使用者需要什么对象就实例化一个对象,现在有这么一个场景,比如我们的系统之前用的是SqlServer,现在需要也支持MySql,那么业务逻辑层也需要改动很多。
现在利用控制反转我们可以将实例化对象交给IOC容器来实现,这样使用者就不需要改动了,用一句话来总结就是:
使用者不再实例化被使用者对象,而交给IOC容器来实现
依赖注入
就是由IoC容器在运行期间,动态地将某种依赖关系注入到对象之中。
这些概念已经有很多文章了,不了解的童鞋可以移步这里http://www.cnblogs.com/qqlin/archive/2012/10/09/2707075.html
Autofac(IOC容器)
那么我们该如何使用这款轻量级且高效的框架呢,本文示例使用的是Autofac 4.2.0版本,上代码
首先需要通过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的实例SqlServerbuilder.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配置文件的节点用途都是一样的,另外还有属性注入和方法两种模式,感兴趣的可以自行研究。
- AutoFac使用~IOC容器(DIP,IOC,DI)
- (转)深入理解DIP、IoC、DI以及IoC容器
- DIP、Ioc、DI、Ioc容器概念
- 浅谈DIP,IoC,DI,IOC容器
- 深入理解DIP、IoC、DI以及IoC容器
- 不可不知的DIP、IoC、DI以及IoC容器
- 深入理解DIP、IoC、DI以及IoC容器
- 深入理解DIP、IoC、DI以及IoC容器
- 深入理解DIP、IoC、DI以及IoC容器
- 深入理解DIP、IoC、DI以及IoC容器
- 深入理解DIP、IoC、DI以及IoC容器
- 深入理解DIP、IoC、DI以及IoC容器
- 深入理解DIP、IoC、DI以及IoC容器
- 深入理解DIP、IoC、DI以及IoC容器
- 深入理解DIP、IoC、DI以及IoC容器
- 深入理解DIP、IoC、DI以及IoC容器
- 深入理解DIP、IoC、DI以及IoC容器
- 深入理解DIP、IoC、DI以及IoC容器
- 矩阵的 Jordan 标准型
- Lua与面向对象
- jdbc连接数据库方式
- 大话排序算法
- Linux创建swap分区(用文件作为Swap分区)
- AutoFac使用~IOC容器(DIP,IOC,DI)
- django模型中外键操作
- 佛祖保佑永无BUG
- libjpeg:将Yuv420P图像数据压缩存储为jpeg图像
- Tomcat+nginx 动静分离
- 自己动手编译opencv源码(Win7 64位+Visual Studio2010+cmake2.8+OpenCV2.4.4)
- You need to use a Theme.AppCompat theme (or descendant) with this activity.
- IIS7.5中神秘的ApplicationPoolIdentity
- Toolbar menu item showAsAction="always" title 颜色设置