Castle.Windsor依赖注入的高级应用与生存周期

1. 使用代码方式进行组件注册【依赖服务类】

复制代码
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;
    }
}
}
复制代码

2. 使用代码方式进行组件注册【不需要依赖】【类似反射的全字符串形式】

复制代码
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. 使用配置文件进行组件注册【不需要依赖】

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("..........");
                }
            }
        }
    }
}
复制代码

4.

5. Castle容器的组件生存周期,主要有如下几种

5.1. Singleton : (容器内单例)容器中只有一个实例将被创建。即一个组件只有一个实例被创建,所有请求的客户使用程序得到的都是同一个实例,同时这也是Castle IOC容器默认的一种处理方式。

5.2. Transient : (临时实例)这种处理方式与我们平时使用new的效果是一样的,对于每次请求中的每次调用得到的都是一个新的实例,但是无法在请求结束时自动销毁(官方文档中说明必须手工调用容器的Release方法)。

5.3. PerThread: (线程内单例)每线程中只存在一个实例。即对于每一个线程来说是使用了Singleton,也就是每一个线程得到的都是同一个实例。

5.4. PerWebRequest : (每次请求单例,http下使用)每次web请求创建一个新实例。即对于每一次web请求来说是使用了Singleton,也就是每一次web请求得到的都是同一个实例,可以在请求结束时自动销毁

5.5. Pooled :使用"池化"方式管理组件,可使用PooledWithSize方法设置池的相关属性。对象池的处理方式,对于不再需用的实例会保存到一个对象池中。

5.6. Custom:自定义的生命处理方式。

 
 
posted @   Linybo2008  阅读(448)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示