Asp.Net MVC 之 Autofac 初步使用1

Autofac是.NET领域最为流行的IOC框架之一,传说是速度最快的一个:

优点: 

  1. 它是C#语言联系很紧密,也就是说C#里的很多编程方式都可以为Autofac使用
  2. 较低的学习曲线,学习它非常的简单,只要你理解了IoC和DI的概念以及在何时需要使用它们
  3. XML配置支持
  4. 自动装配 与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

运行效果:

 

 

posted @ 2017-03-06 16:06  __Burt  阅读(801)  评论(0编辑  收藏  举报