zoukankan      html  css  js  c++  java
  • 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");//取默认的


  • 相关阅读:
    leetcode 78 子集
    leetcode 404 左叶子之和
    《数学有意思》28杠杆原理 29信息革命 30可信的数学
    《数学有意思》25中心极限定理 26混沌现象 27焦虑
    《数学有意思》22算术和几何 23统计学 24概率
    《数学有意思》19数学语言 20函数 21无理数
    《数学有意思》16归纳法 17因果关系 18物理学
    《数学有意思》13度量的本质 14度量单位 15科学也是一种模型
    《数学有意思》10思维工具 11选择合适的数学模型 12几何学
    《数学有意思》07公理是“公认的道理”吗 08什么是好的公里系统 09数学模型
  • 原文地址:https://www.cnblogs.com/8090sns/p/9117494.html
Copyright © 2011-2022 走看看