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

[转]Castle.Windsor依赖注入的高级应用_Castle.Windsor.3.1.0

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 : 容器中只有一个实例将被创建

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

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

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

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

时间: 2024-11-09 05:17:52

Castle.Windsor依赖注入的高级应用_Castle.Windsor.3.1.0的相关文章

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

ASP.NET Web API - 使用 Castle Windsor 依赖注入

示例代码 项目启动时,创建依赖注入容器 定义一静态容器 IWindsorContainer 1 private static IWindsorContainer _container; 在 Application_Start() 中,创建该容器 1 _container = new WindsorContainer(); 调用 Container Install 方法,向容器内注册组件 1 _container.Install(FromAssembly.This()); 该语句会调用整个程序集中

小白初学Ioc、DI、Castle Windsor依赖注入,大神勿入(不适)

过了几天,我又来了.上一篇中有博友提到要分享下属于我们abp初学者的历程,今天抽出点时间写写吧.起初,我是直接去看阳光铭睿的博客,看了一遍下来,感觉好多东西没接触过,接着我又去下了github 里面下了几个例子来看,看起来还是有点吃力,毕竟我只用过MVC3和asp.net4.0以及EntityFramework3.5 ,突然感觉自己好像跟世界脱轨了,什么IOC只是听老师提过,当时不知道有什么用就没怎么听,AutoMapper,AngularJS,Less什么的没听过.没办法,只好先去一个一个把他

Windsor 依赖注入

Windsor 学习 1.安装nuget   Install-Package Castle.Windsor 安装后会多这两个引用  2.hello world class Program { static void Main(string[] args) { // 应用开始... var container = new WindsorContainer(); // 使用windstorinstallers从执行程序集添加和配置所有组件 container.Install(FromAssembly

基于DDD的.NET开发框架 - ABP依赖注入

返回ABP系列 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应用程序的新起点,它旨在成为一个通用的WEB应用程序框架和项目模板. ABP的官方网站:http://www.aspnetboilerplate.com ABP官方文档:http://www.aspnetboilerplate.com/Pages/Documents Github上的开源项目:http

ninject依赖注入

ninject是一个轻量级的依赖注入在性能上不及spring,castle的依赖注入但在一般的项目中还是能满足需求的,话不所说看看怎么用吧! 首先在nuget上下载安装包: 新建一个mvc项目: 在项目中新建一个NinjectWebComment类,在类中添加下列代码: public static class NinjectWebCommon { private static readonly Bootstrapper bootstrapper = new Bootstrapper(); ///

PHP 依赖注入和控制反转再谈(二)

今天有个朋友看到yii2中介绍的依赖注入一头雾水,之前我写过类似的文章发给他看了,可能还没深入理解吧,这里我再通俗点描述下依赖注入的原理吧,尽可能滴说通俗易懂一点吧:先还是扯下概念性滴问题(概念问题我个人的原则总是先简单瞟一眼概念,通过实例来对概念加深理解了) 要想理解 PHP 依赖注入 和 控制反转 两个概念,我们还是必须搞清楚下面的两个问题: DI -- Dependency Injection 依赖注入 IoC -- Inversion of Control 控制反转 什么是依赖注入 没有

Castle Windsor 实现依赖注入和APO

添加以下项目目录,Repository实现IRepository 接口,Service里面通过构造函数注入,实现Repository的实例化,ConsoleApp1里面通过构造函数注入,实现Service的实例化 namespace IRepository { public interface ITestRepository { void Say(); } } public class TestRepository : ITestRepository { public void Say() {

MVC Castle依赖注入实现代码

1.MVc 实现依赖注入 public class WindsorControllerFactory : DefaultControllerFactory { private readonly IKernel _kernel; public WindsorControllerFactory(IKernel kernel) { _kernel = kernel; } protected override IController GetControllerInstance(System.Web.Ro