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, @"Configs\autofac.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");//取默认的


猜你喜欢

转载自www.cnblogs.com/8090sns/p/9117494.html