• Autofac 4 netcore with config demo


    Autofac 4+以上和以前的配置不一样的,最近在NetCore中做项目,得到实例时折腾了一番。

    使用场景,用autofac实例化数据库类型,避免一个个的去new

    json配置文件:

    <?xml version="1.0" encoding="utf-8" ?>
    <autofac defaultAssembly="Data.Orm.Dapper">
      <components name="Chloe">
        <key>ChloeMssqlKey</key>
        <type>Data.Orm.Chloe.SqlServerDatabase,Data.Orm.Chloe</type>
        <services name="IDatabase2" type="Data.DbFactory.IDatabase,Data.DbFactory" />
        <injectProperties>true</injectProperties>
        <parameters>
          <conn>4</conn>
        </parameters>
      </components>
      <components name="DapperMssql">
        <key>DapperMssqlKey</key>
        <type>Data.Orm.Dapper.SqlServerDatabase, Data.Orm.Dapper</type>
        <services name="IDatabase" type="Data.DbFactory.IDatabase,Data.DbFactory" />
        <injectProperties>true</injectProperties>
        <parameters>
          <conn>4</conn>
        </parameters>
      </components>
    </autofac>
    

      注册:

    var config = new ConfigurationBuilder();
                string path = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, @"Configsautofac.xml");
                //config.AddJsonFile(path);//Microsoft.Extensions.Configuration.json.dll
                config.AddXmlFile(path);//Microsoft.Extensions.Configuration.xml.dll
    
                // Register the ConfigurationModule with Autofac.
                var module = new ConfigurationModule(config.Build());
                var builder = new ContainerBuilder();
                builder.RegisterModule(module);
                container = builder.Build();

    获取:

    /// <summary>
            /// 获取对象实例
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="serviceName">数据库类型</param>
            /// <param name="param">数据库连接串等参数</param>
            /// <returns></returns>
            public static T GetDbInstance<T>(string serviceName, params Parameter[] param)
            {
                if (container != null)
                {
                    var serviceList = container.Resolve<IEnumerable<T>>(param);//http://www.bkjia.com/Asp_Netjc/1315802.html
                    foreach (var service in serviceList)
                    {
                        if (service.ToString().ToLower().Equals(serviceName.ToLower()))
                        {
                            return service;
                        }
                    }
                }
                return default(T);
            }
    container.Resolve<IEnumerable<T>>(param)这个地方折腾了好久,开始以为像以前一样注册多个,可以根据ID或name获取,实际上一直未获取到(这里一直不知道原因,一直提示未注册,希望高人可以指点下)

    container.Resolve<Service>(param)
    container.ResolveNamed<Service>()
    container.ResolveKeyed<Service>()

    如果去掉IEnumerable,则只能得到最后一个组件。

    另外,参数说明:

    Autofac提供了集中参数匹配类别:

    • NamedParameter - 直接通过名称匹配目标参数
    • TypedParameter - 通过类型来匹配目标参数
    • ResolvedParameter - 灵活的参数匹配

    NamedParameter 和 TypedParameter只支持常量。

    ResolvedParameter 能够使用从容器中动态解析的值作为参数, 例如通过名字解析出的服务。

    比如数据库连接:可以在xml配置一个默认的,也可以动态实例化时传入进去:

    Data.DbFactory.IDatabase database  = BaseUtility.Ioc.AutofacHelper.GetDbInstance<Data.DbFactory.IDatabase>("Data.Orm.Chloe.SqlServerDatabase",
                    new ResolvedParameter(
               (pi, ctx) => pi.ParameterType == typeof(string) && pi.Name == "conn",
               (pi, ctx) => "Data Source = .;Initial Catalog = Opencsharp.Net;Integrated Security = SSPI;")
                    );//按实际传入的实例化
                Data.DbFactory.IDatabase database2 = BaseUtility.Ioc.AutofacHelper.GetDbInstance<Data.DbFactory.IDatabase>("Data.Orm.Chloe.SqlServerDatabase");//取默认的


  • 相关阅读:
    如果控制文件损坏那么如何恢复?恢复控制文件的方式有哪几种
    【OCP|OCM】Oracle培训考证系列
    【RMAN】Oracle中如何备份控制文件?备份控制文件的方式有哪几种?
    在高并发、高负载的情况下,如何给表添加字段并设置DEFAULT值?
    CentOS 7.1静默安装11.2.0.3 64位单机数据库软件
    造成错误“ORA-12547: TNS:lost contact”的常见原因有哪些?
    如何让oracle DB、监听和oem开机启动(dbstart)
    ipcs、ipcrm、sysresv、kernel.shmmax
    【DG】利用闪回数据库(flashback)修复Failover后的DG环境
    【BBED】BBED模拟并修复ORA-08102错误
  • 原文地址:https://www.cnblogs.com/8090sns/p/9117494.html
Copyright © 2020-2023  润新知