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 : 每次web请求创建一个新实例。即对于每一次web请求来说是使用了Singleton,也就是每一次web请求得到的都是同一个实例,可以在请求结束时自动销毁。

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

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

 
 

Castle.Windsor依赖注入的高级应用与生存周期的更多相关文章

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

    [转]Castle.Windsor依赖注入的高级应用_Castle.Windsor.3.1.0 1. 使用代码方式进行组件注册[依赖服务类] using System; using System.Co ...

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

    过了几天,我又来了.上一篇中有博友提到要分享下属于我们abp初学者的历程,今天抽出点时间写写吧.起初,我是直接去看阳光铭睿的博客,看了一遍下来,感觉好多东西没接触过,接着我又去下了github 里面下 ...

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

    示例代码 项目启动时,创建依赖注入容器 定义一静态容器 IWindsorContainer private static IWindsorContainer _container; 在 Applica ...

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

    返回ABP系列 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应 ...

  5. (译)ABP之依赖注入

    原文地址:https://aspnetboilerplate.com/Pages/Documents/Dependency-Injection 什么是依赖注入 传统方式的问题 解决方案 构造函数注入 ...

  6. Unity文档阅读 第二章 依赖注入

    Introduction 介绍Chapter 1 outlines how you can address some of the most common requirements in enterp ...

  7. [Castle Windsor]学习依赖注入

    初次尝试使用Castle Windsor实现依赖注入DI,或者叫做控制反转IOC. 参考: https://github.com/castleproject/Windsor/blob/master/d ...

  8. Castle Windsor 使MVC Controller能够使用依赖注入

    以在MVC中使用Castle Windsor为例 1.第一步要想使我们的Controller能够使用依赖注入容器,先定义个WindsorControllerFactory类, using System ...

  9. 依赖注入容器之Castle Windsor

    一.Windsor的使用 Windsor的作为依赖注入的容器的一种,使用起来比较方便,我们直接在Nuget中添加Castle Windsor,将会自动引入Castle.Core 和 Castle.Wi ...

随机推荐

  1. Difference between Process and thread?

    What are the differences between a process and a thread? How are they similar? How can 2 threads com ...

  2. Python3之调试

    程序能一次写完并正常运行的概率很小,基本不超过1%.总会有各种各样的bug需要修正.有的bug很简单,看看错误信息就知道,有的bug很复杂,我们需要知道出错时,哪些变量的值是正确的,哪些变量的值是错误 ...

  3. Python扫描器-端口扫描

    结合渗透测试最常见就是单个域名扫指纹,自动子域名查找.获取所有子域名的IP,自动C段IP查找相同子域名,利用有效IP扫端口. 常见端口库扫描 service_list = { 21:"FTP ...

  4. 【Gstreamer开发】TI嵌入式处理器GStreamer pipeline

    Example GStreamer Pipelines From Texas Instruments Embedded Processors Wiki Jump to: navigation, sea ...

  5. 19-js策略模式

    var PriceStrategy = function() { var stragtegy = { return30: function(price) { return +price + parse ...

  6. [转帖]ARM发布Ethos-N57/N73 NPU、Mali-G57 Valhall GPU和Mali-D37 DPU

    ARM发布Ethos-N57/N73 NPU.Mali-G57 Valhall GPU和Mali-D37 DPU https://www.cnbeta.com/articles/tech/902417 ...

  7. Python18之函数定义及调用,注释

    一.函数定义 def 函数名(形参1,形参2...): 函数体 return 返回值         (可以返回任何东西,一个值,一个变量,或是另一个函数的返回值,如果函数没有返回值,可以省略retu ...

  8. PAT(B) 1068 万绿丛中一点红(C)

    题目链接:1068 万绿丛中一点红 (20 point(s)) 参考博客:1068. 万绿丛中一点红(20) i逆天耗子丶 题目描述 对于计算机而言,颜色不过是像素点对应的一个 24 位的数值.现给定 ...

  9. WUSTOJ 1344: still水题(Java)进制转换

    题目链接:1344: still水题 Description 送AC,不解释 Input 输入两个整数n和b,b表示该数的进制(包含2.8.16进制,多组数组) Output 输出该整数(10进制,每 ...

  10. Scratch 少儿编程之旅(四)— Scratch入门动画《小猫捉蝴蝶》(中)

    本期内容概括: 了解Scratch的更多操作,用[无限循环]来更改“小猫”角色的代码: 添加[碰到边缘就反弹]积木块指令: 更改角色的旋转模式和造型,让”小猫”走路更生动: 两种[循环]语句的区别: ...