zoukankan      html  css  js  c++  java
  • 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:自定义的生命处理方式。

     
     
  • 相关阅读:
    A10 React+AntDesign 组件、父子组件通信、defaultProps、propTypes
    A09 React+AntDesign 模块封装,可供所有组件使用(以对todolist的小优化为例)
    A08 React+AntDesign todolist小项目(下)
    A07 React+AntDesign todolist小项目(上)
    A06 React+AntDesign 表单详解
    A05 React+AntDesign 事件对象、键盘事件、表单事件、类似vue的数据双向绑定
    A04 React+AntDesign 方法、事件、获取数据、改变数据、改变this指向
    A03 React+AntDesign 初识、目录结构、数据绑定、属性绑定、引入图片、循环数组
    泛型学习
    PowerDesigner16.5汉化破解版安装教程(含安装文件、汉化包、破解文件)
  • 原文地址:https://www.cnblogs.com/linybo/p/12083636.html
Copyright © 2011-2022 走看看