zoukankan      html  css  js  c++  java
  • 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

    运行效果:

     

    作者:_Burt

    出处:http://www.cnblogs.com/Burt/

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    hadoop中namenode发生故障的处理方法
    开启虚拟机所报的错误:VMware Workstation cannot connect to the virtual machine. Make sure you have rights to run the program, access all directories the program uses, and access all directories for temporary fil
    Hbase的安装与部署(集群版)
    分别用反射、编程接口的方式创建DataFrame
    用Mapreduce求共同好友
    SparkSteaming中直连与receiver两种方式的区别
    privot函数使用
    Ajax无刷新显示
    使用ScriptManager服务器控件前后台数据交互
    数据库知识
  • 原文地址:https://www.cnblogs.com/Burt/p/6510392.html
Copyright © 2011-2022 走看看