依賴注入 Autofac的高階使用
阿新 • • 發佈:2020-10-21
原文:https://blog.csdn.net/liuweitoo/article/details/8278472
Autofac.2.6.3.862
一、 使用程式碼方式進行元件註冊【依賴服務類和元件類】
/// <summary> /// 管理類 /// </summary> public partial class Mgr { private static IContainer container = null; /// <summary> /// 自定義容器和元件註冊 /// </summary> /// <returns></returns> public static IContainer GetContainer() { if (container == null) { var builder = new ContainerBuilder(); //builder.RegisterType<SqlDatabase>().As<IDatabase>(); builder.RegisterType<SqlDatabase>().Named<IDatabase>("AutofacDemo.Lib.Sql.SqlDatabase"); builder.RegisterType<OracleDatabase>().Named<IDatabase>("AutofacDemo.Lib.Oracle.OracleDatabase"); container = builder.Build(); } return container; } }
二. 使用配置檔案進行元件註冊【不需要依賴】
2.1. 定義配置檔案
<?xml version="1.0"?> <configuration> <configSections> <section name="autofac" type="Autofac.Configuration.SectionHandler, Autofac.Configuration"/> </configSections> <autofac> <components> <component name="AutofacDemo.Lib.Oracle.OracleDatabase" type="AutofacDemo.Lib.Oracle.OracleDatabase, AutofacDemo.Lib.Oracle" service="AutofacDemo.Lib.IDatabase, AutofacDemo.Lib"/> <component name="AutofacDemo.Lib.Sql.SqlDatabase" type="AutofacDemo.Lib.Sql.SqlDatabase, AutofacDemo.Lib.Sql" service="AutofacDemo.Lib.IDatabase, AutofacDemo.Lib"/> </components> </autofac> <startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
2.2. 讀取config配置檔案進行元件註冊
/// <summary> /// 根據配置檔案裡的服務名生成物件 /// </summary> public static void GetFrom_Config() { var builder = new ContainerBuilder(); //從.config配置檔案中取得相關的元件註冊 builder.RegisterModule(new ConfigurationSettingsReader("autofac")); using (var container = builder.Build()) { string vServiceName = "AutofacDemo.Lib.Oracle.OracleDatabase";//服務名 //vServiceName = "AutofacDemo.Lib.Sql.SqlDatabase"; //是否存在服務名 if (container != null) { if (container.IsRegisteredWithName(vServiceName, typeof(IDatabase))) { IDatabase db = container.ResolveNamed<IDatabase>(vServiceName); if (db != null) { db.Select(".........."); } } } } }
2.3. 是否存在服務名,存在,則根據服務名取得物件
//是否存在服務名
if (container.IsRegisteredWithName(vServiceName, typeof(IDatabase)))
{
IDatabase db = container.ResolveNamed<IDatabase>(vServiceName);
if (db != null)
{
db.Select("..........");
}
}
三. Demo下載
四. 使用程式碼方式進行元件註冊【不需要依賴】【類似反射的全字串形式】
/// <summary>
/// 自定義容器和通過反射進行元件註冊
/// </summary>
/// <returns></returns>
public static IContainer GetContainer()
{
if (container == null)
{
var builder = new ContainerBuilder();
Type objType = Type.GetType("AutofacDemo.Lib.IDatabase, AutofacDemo.Lib");
Type objTypeA = Type.GetType("AutofacDemo.Lib.Oracle.OracleDatabase, AutofacDemo.Lib.Oracle");
Type objTypeB = Type.GetType("AutofacDemo.Lib.Sql.SqlDatabase, AutofacDemo.Lib.Sql");
builder.RegisterType(objTypeA).Named("AutofacDemo.Lib.Oracle.OracleDatabase", objType);
builder.RegisterType(objTypeB).Named("AutofacDemo.Lib.Sql.SqlDatabase", objType);
需要知道介面
//builder.RegisterType(objTypeA).Named<objType>("AutofacDemo.Lib.Sql.SqlDatabase");
//builder.RegisterType(objTypeB).Named<objType>("AutofacDemo.Lib.Oracle.OracleDatabase");
container = builder.Build();
}
return container;
}