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/

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

  • 相关阅读:
    四则运算
    屏蔽恶意IP
    Vue企业级优雅实战05-框架开发01-登录界面
    Vue企业级优雅实战04-组件开发01-SVG图标组件
    Vue企业级优雅实战03-准备工作04-全局设置
    Vue企业级优雅实战02-准备工作03-提交 GIT 平台
    802.11ax TWT
    leetcode338
    春招实习面经(已拿阿里/腾讯/亚马逊)
    leetcode weekly contest138
  • 原文地址:https://www.cnblogs.com/Burt/p/6510392.html
Copyright © 2011-2022 走看看