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");//取默认的