依賴注入 Castle.Windsor高階應用
阿新 • • 發佈:2020-10-21
原文:https://blog.csdn.net/liuweitoo/article/details/8281213
_Castle.Windsor.3.1.0
一. 使用程式碼方式進行元件註冊【依賴服務類】
using System; using System.Collections.Generic; using System.Linq; using System.Text; using CastleDemo.Lib; using Castle.Windsor; using Castle.Windsor.Configuration.Interpreters; using Castle.MicroKernel.Registration; namespace CastleDemo.Lib.Mgr { /// <summary> /// 管理類 /// </summary> public partial class Mgr { private static IWindsorContainer container = null; /// <summary> /// 自定義容器和元件註冊 /// </summary> /// <returns></returns> public static IWindsorContainer GetContainer() { if (container == null) { Type objTypeA = Type.GetType("CastleDemo.Lib.Oracle.OracleDatabase, CastleDemo.Lib.Oracle"); Type objTypeB = Type.GetType("CastleDemo.Lib.Sql.SqlDatabase, CastleDemo.Lib.Sql"); //建立容器 IWindsorContainer tmpContainer = new WindsorContainer(); //加入元件:舊版 //tmpContainer.AddComponent("CastleDemo.Lib.Oracle.OracleDatabase", typeof(IDatabase), objTypeA); //tmpContainer.AddComponent("CastleDemo.Lib.Sql.SqlDatabase", typeof(IDatabase), objTypeB); //加入元件:新版 tmpContainer.Register(Component.For(typeof(IDatabase)).ImplementedBy(objTypeA).Named("CastleDemo.Lib.Oracle.OracleDatabase")); tmpContainer.Register(Component.For(typeof(IDatabase)).ImplementedBy(objTypeB).Named("CastleDemo.Lib.Sql.SqlDatabase")); container = tmpContainer; } return container; } } }
二. 使用程式碼方式進行元件註冊【不需要依賴】【類似反射的全字串形式】
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Castle.Windsor; using Castle.Windsor.Configuration.Interpreters; using Castle.MicroKernel.Registration; namespace CastleDemo.Lib.Container { /// <summary> /// 管理類 /// </summary> public partial class Container { private static IWindsorContainer container = null; /// <summary> /// 自定義容器和元件註冊 /// </summary> /// <returns></returns> public static IWindsorContainer GetContainer() { if (container == null) { Type objType = Type.GetType("CastleDemo.Lib.IDatabase, CastleDemo.Lib"); Type objTypeA = Type.GetType("CastleDemo.Lib.Oracle.OracleDatabase, CastleDemo.Lib.Oracle"); Type objTypeB = Type.GetType("CastleDemo.Lib.Sql.SqlDatabase, CastleDemo.Lib.Sql"); //建立容器 IWindsorContainer tmpContainer = new WindsorContainer(); //加入元件:舊版 //tmpContainer.AddComponent("CastleDemo.Lib.Oracle.OracleDatabase", objType, objTypeA); //tmpContainer.AddComponent("CastleDemo.Lib.Sql.SqlDatabase", objType, objTypeB); //加入元件:新版 tmpContainer.Register(Component.For(objType).ImplementedBy(objTypeA).Named("CastleDemo.Lib.Oracle.OracleDatabase")); tmpContainer.Register(Component.For(objType).ImplementedBy(objTypeB).Named("CastleDemo.Lib.Sql.SqlDatabase")); container = tmpContainer; } return container; } } }
三. 使用配置檔案進行元件註冊【不需要依賴】
3.1. 定義配置檔案
<?xml version="1.0"?> <configuration> <configSections> <section name="castle" type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor" /> </configSections> <castle> <components> <component name="CastleDemo.Lib.Oracle.OracleDatabase" type="CastleDemo.Lib.Oracle.OracleDatabase, CastleDemo.Lib.Oracle" service="CastleDemo.Lib.IDatabase, CastleDemo.Lib"/> <component name="CastleDemo.Lib.Sql.SqlDatabase" type="CastleDemo.Lib.Sql.SqlDatabase, CastleDemo.Lib.Sql" service="CastleDemo.Lib.IDatabase, CastleDemo.Lib"/> </components> </castle> <startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
3.2. 讀取config配置檔案進行元件註冊
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CastleDemo.Lib;
using Castle.Windsor;
using Castle.Windsor.Configuration.Interpreters;
using Castle.MicroKernel.Registration;
namespace CastleDemo.Run
{
public partial class Helper
{
/// <summary>
/// 根據配置檔案裡的服務名生成物件
/// </summary>
public static void GetFrom_Config()
{
IWindsorContainer container = new WindsorContainer(new XmlInterpreter());
string vServiceName = "CastleDemo.Lib.Oracle.OracleDatabase";//服務名
vServiceName = "CastleDemo.Lib.Sql.SqlDatabase";
if (container != null)
{
IDatabase db = container.Resolve<IDatabase>(vServiceName);
if (db != null)
{
db.Select("..........");
}
}
}
}
}
四. Demo下載
五. Castle容器的元件生存週期,主要有如下幾種
- 5.1. Singleton : 容器中只有一個例項將被建立
- 5.2. Transient : 每次請求建立一個新例項
- 5.3. PerThread: 每執行緒中只存在一個例項
- 5.4. PerWebRequest : 每次web請求建立一個新例項
- 5.5. Pooled :使用"池化"方式管理元件,可使用PooledWithSize方法設定池的相關屬性