Castle.Windsor依赖注入的高级应用

2021-01-22 08:11

阅读:535

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
{
/// 
/// 管理类
/// 
public partial class Mgr
{
    private static IWindsorContainer container = null;
    /// 
    /// 自定义容器和组件注册
    /// 
    /// 
    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
{
/// 
/// 管理类
/// 
public partial class Container
{
    private static IWindsorContainer container = null;
    /// 
    /// 自定义容器和组件注册
    /// 
    /// 
    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
    {
        /// 
        /// 根据配置文件里的服务名生成对象
        /// 
        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(vServiceName);
                if (db != null)
                {
                    db.Select("..........");
                }
            }
        }
    }
}
技术图片

4.

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

5.1. Singleton : 容器中只有一个实例将被创建

5.2. Transient : 每次请求创建一个新实例

5.3. PerThread: 每线程中只存在一个实例

5.4. PerWebRequest : 每次web请求创建一个新实例

5.5. Pooled :使用"池化"方式管理组件,可使用PooledWithSize方法设置池的相关属性

Castle.Windsor依赖注入的高级应用

标签:acl   style   add   demo   方式   lint   eof   art   typeof   

原文地址:https://www.cnblogs.com/linybo/p/12083636.html


评论


亲,登录后才可以留言!