zoukankan      html  css  js  c++  java
  • 依赖注入 Autofac的高级使用

    原文:https://blog.csdn.net/liuweitoo/article/details/8278472


    Autofac.2.6.3.862

    一、 使用代码方式进行组件注册【依赖服务类和组件类】

    /// <summary>
        /// 管理类
        /// </summary>
        public partial class Mgr
        {
            private static IContainer container = null;
    
            /// <summary>
            /// 自定义容器和组件注册
            /// </summary>
            /// <returns></returns>
            public static IContainer GetContainer()
            {
    
                if (container == null)
                {
                    var builder = new ContainerBuilder();
                    //builder.RegisterType<SqlDatabase>().As<IDatabase>();
                    builder.RegisterType<SqlDatabase>().Named<IDatabase>("AutofacDemo.Lib.Sql.SqlDatabase");
                    builder.RegisterType<OracleDatabase>().Named<IDatabase>("AutofacDemo.Lib.Oracle.OracleDatabase");
    
                    container = builder.Build();
    
                }
                return container;
            }
        }

    二. 使用配置文件进行组件注册【不需要依赖】

    2.1. 定义配置文件

    <?xml version="1.0"?>
    <configuration>
      <configSections>
        <section name="autofac" type="Autofac.Configuration.SectionHandler, Autofac.Configuration"/>
      </configSections>
      <autofac>
        <components>
          <component name="AutofacDemo.Lib.Oracle.OracleDatabase" type="AutofacDemo.Lib.Oracle.OracleDatabase, AutofacDemo.Lib.Oracle" service="AutofacDemo.Lib.IDatabase, AutofacDemo.Lib"/>
          <component name="AutofacDemo.Lib.Sql.SqlDatabase" type="AutofacDemo.Lib.Sql.SqlDatabase, AutofacDemo.Lib.Sql" service="AutofacDemo.Lib.IDatabase, AutofacDemo.Lib"/>
        </components>
      </autofac>
    <startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
    

    2.2. 读取config配置文件进行组件注册

            /// <summary>
            /// 根据配置文件里的服务名生成对象
            /// </summary>
            public static void GetFrom_Config()
            {
    
    
                var builder = new ContainerBuilder();
    
                //从.config配置文件中取得相关的组件注册
                builder.RegisterModule(new ConfigurationSettingsReader("autofac")); 
    
               
    
                using (var container = builder.Build())
                {
                    string vServiceName = "AutofacDemo.Lib.Oracle.OracleDatabase";//服务名
                    //vServiceName = "AutofacDemo.Lib.Sql.SqlDatabase";
    
                    //是否存在服务名
                    if (container != null)
                    {
                        if (container.IsRegisteredWithName(vServiceName, typeof(IDatabase)))
                        {
                            IDatabase db = container.ResolveNamed<IDatabase>(vServiceName);
                            if (db != null)
                            {
                                db.Select("..........");
                            }
                        }
                    }
                }
            }

    2.3. 是否存在服务名,存在,则根据服务名取得对象

                    //是否存在服务名
                    if (container.IsRegisteredWithName(vServiceName, typeof(IDatabase)))
                    {
                        IDatabase db = container.ResolveNamed<IDatabase>(vServiceName);
                        if (db != null)
                        {
                            db.Select("..........");
                        }
                    }

    三. Demo下载

    点此下载

    四. 使用代码方式进行组件注册【不需要依赖】【类似反射的全字符串形式】

    /// <summary>
            /// 自定义容器和通过反射进行组件注册
            /// </summary>
            /// <returns></returns>
            public static IContainer GetContainer()
            {
    
                if (container == null)
                {
                    var builder = new ContainerBuilder();
    
    
                    Type objType = Type.GetType("AutofacDemo.Lib.IDatabase, AutofacDemo.Lib");
                    Type objTypeA = Type.GetType("AutofacDemo.Lib.Oracle.OracleDatabase, AutofacDemo.Lib.Oracle");
                    Type objTypeB = Type.GetType("AutofacDemo.Lib.Sql.SqlDatabase, AutofacDemo.Lib.Sql");
    
    
                    builder.RegisterType(objTypeA).Named("AutofacDemo.Lib.Oracle.OracleDatabase", objType);
                    builder.RegisterType(objTypeB).Named("AutofacDemo.Lib.Sql.SqlDatabase", objType);
    
    
                    需要知道接口
                    //builder.RegisterType(objTypeA).Named<objType>("AutofacDemo.Lib.Sql.SqlDatabase");
                    //builder.RegisterType(objTypeB).Named<objType>("AutofacDemo.Lib.Oracle.OracleDatabase");
    
                    container = builder.Build();
    
                }
                return container;
            }
    

     download

  • 相关阅读:
    Maven---右键Servlet模板
    付宇泽 20191128-1 总结
    付宇泽20191121-1 每周例行报告
    付宇泽20191114-1 每周例行报告
    安装tensorflow时出现找不到模块问题
    罗杨美慧 20191128-1 总结
    罗杨美慧 20191121-1 每周例行报告
    罗杨美慧 20191114-1 每周例行报告
    罗杨美慧 20191107-1 每周例行报告
    罗杨美慧 20191031-1 每周例行报告
  • 原文地址:https://www.cnblogs.com/springsnow/p/13852482.html
Copyright © 2011-2022 走看看