Autofac 4+以上和之前的配置不同的,最近在NetCore中作项目,获得实例时折腾了一番。javascript
使用场景,用autofac实例化数据库类型,避免一个个的去newhtml
json配置文件:java
<?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>
注册:sql
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>()json
若是去掉IEnumerable,则只能获得最后一个组件。
另外,参数说明:
Autofac提供了集中参数匹配类别:app
NamedParameter 和 TypedParameter只支持常量。ui
ResolvedParameter 可以使用从容器中动态解析的值做为参数, 例如经过名字解析出的服务。spa
好比数据库链接:能够在xml配置一个默认的,也能够动态实例化时传入进去:code
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");//取默认的