Autofac是.NET领域最为流行的IOC框架之一,传说是速度最快的一个:
优点:
- 它是C#语言联系很紧密,也就是说C#里的很多编程方式都可以为Autofac使用
- 较低的学习曲线,学习它非常的简单,只要你理解了IoC和DI的概念以及在何时需要使用它们
- XML配置支持
- 自动装配 与Asp.Net MVC 集成
通过VS中的NuGet来加载AutoFac,不论是哪种方式,最终的目的就是将 Autofac.dll程序集引用到你的项目中。
demo1结构
数据访问的接口IDAL
public interface IDAL { string Insert(string commandText); }
Sql和Oracle两种方式分别实现IDAL接口
public class SqlDAL : IDAL { public string Insert(string commandText) { return commandText + "-------use sqlserver..."; } } public class OracalDAL : IDAL { public string Insert(string commandText) { return commandText+"-------use oracle..."; } }
然后定义DBManager 构造函数注入
public class DBManager { IDAL _dal; public DBManager(IDAL dal) { _dal = dal; } public string Insert(string commandText) { return _dal.Insert(commandText); } }
最后要真正完成依赖注入依靠AtuoFac
1. RegisterType<Object>().As<Iobject>()
# region builder.RegisterType<Object>().As<Iobject>() var builder = new ContainerBuilder(); builder.RegisterType<DBManager>(); builder.RegisterType<SqlDAL>().As<IDAL>(); //↑↑↑ builder.RegisterType<Object>().As<Iobject>():注册类型及其实例 注册接口IDAL的实例SqlDAL ↑↑↑ using (var container = builder.Build()) { var manager = container.Resolve<DBManager>(); //↑↑↑ 解析某个接口的实例。 ViewBag.SqlResult = manager.Insert(" insert into test values('test1','Shanghai') "); } #endregion
运行效果:
2.RegisterType<Object>().Named<Iobject>(string name)
# region builder.RegisterType<Object>().Named<Iobject>(string name) var builder = new ContainerBuilder(); builder.RegisterType<SqlDAL>().Named<IDAL>("sql"); builder.RegisterType<OracleDAL>().Named<IDAL>("oracle"); //为一个接口注册不同的实例。有时候难免会碰到多个类映射同一个接口,比如SqlDAL和OracleDAL都实现了IDAL接口,为了准确获取想要的类型,就必须在注册时起名字。 using (var container = builder.Build()) { //var manager = (SqlDAL)container.ResolveNamed<IDAL>("sql"); var manager = container.ResolveNamed<IDAL>("oracle"); ViewBag.SqlResult = manager.Insert(" insert into test values('test1','Shanghai') "); } #endregion
运行效果:
3.builder.RegisterType<Object>().Keyed<Iobject>(Enum enum)
public enum DBType { Sql, Oracle }
# region builder.RegisterType<Object>().Keyed<Iobject>(Enum enum) var builder = new ContainerBuilder(); //以枚举的方式为一个接口注册不同的实例。有时候我们会将某一个接口的不同实现用枚举来区分,而不是字符串 builder.RegisterType<SqlDAL>().Keyed<IDAL>(DBType.Sql).InstancePerDependency(); // ↑↑↑ InstancePerDependency() 用于控制对象的生命周期,每次加载实例时都是新建一个实例,默认就是这种方式 builder.RegisterType<OracleDAL>().Keyed<IDAL>(DBType.Oracle).SingleInstance(); // ↑↑↑ SingleInstance() 用于控制对象的生命周期,每次加载实例时都是返回同一个实例 using (var container = builder.Build()) { var manager = container.ResolveKeyed<IDAL>(DBType.Sql); // var manager = (OracleDAL)container.ResolveKeyed<IDAL>(DBType.Oracle); ViewBag.SqlResult = manager.Insert(" insert into test values('test1','Shanghai') "); } #endregion
运行效果: