依赖注入 Castle.Windsor高级应用

2020-12-20 04:35

阅读:808

标签:container   size   tar   ice   XML   EDA   eric   实例   ==   

原文: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
{
    /// 
    /// 管理类
    /// 
    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;
        }
    }
}

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

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.1. 定义配置文件

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("..........");
                }

            }

        }



    }
}

四. Demo下载

点此下载

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

  • 5.1. Singleton : 容器中只有一个实例将被创建
  • 5.2. Transient : 每次请求创建一个新实例
  • 5.3. PerThread: 每线程中只存在一个实例
  • 5.4. PerWebRequest : 每次web请求创建一个新实例
  • 5.5. Pooled :使用"池化"方式管理组件,可使用PooledWithSize方法设置池的相关属性

依赖注入 Castle.Windsor高级应用

标签:container   size   tar   ice   XML   EDA   eric   实例   ==   

原文地址:https://www.cnblogs.com/springsnow/p/13852511.html


评论


亲,登录后才可以留言!