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方法设置池的相关属性
Castle.Windsor依赖注入的高级应用_Castle.Windsor.3.1.0的更多相关文章
- Castle.Windsor依赖注入的高级应用与生存周期
1. 使用代码方式进行组件注册[依赖服务类] using System; using System.Collections.Generic; using System.Linq; using Syst ...
- 小白初学Ioc、DI、Castle Windsor依赖注入,大神勿入(不适)
过了几天,我又来了.上一篇中有博友提到要分享下属于我们abp初学者的历程,今天抽出点时间写写吧.起初,我是直接去看阳光铭睿的博客,看了一遍下来,感觉好多东西没接触过,接着我又去下了github 里面下 ...
- ASP.NET Web API - 使用 Castle Windsor 依赖注入
示例代码 项目启动时,创建依赖注入容器 定义一静态容器 IWindsorContainer private static IWindsorContainer _container; 在 Applica ...
- 基于DDD的.NET开发框架 - ABP依赖注入
返回ABP系列 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应 ...
- (译)ABP之依赖注入
原文地址:https://aspnetboilerplate.com/Pages/Documents/Dependency-Injection 什么是依赖注入 传统方式的问题 解决方案 构造函数注入 ...
- Unity文档阅读 第二章 依赖注入
Introduction 介绍Chapter 1 outlines how you can address some of the most common requirements in enterp ...
- 07、NetCore2.0依赖注入(DI)之生命周期
07.NetCore2.0依赖注入(DI)之生命周期 NetCore2.0依赖注入框架(DI)是如何管理注入对象的生命周期的?生命周期有哪几类,又是在哪些场景下应用的呢? -------------- ...
- PHP 依赖注入和控制反转再谈(二)
今天有个朋友看到yii2中介绍的依赖注入一头雾水,之前我写过类似的文章发给他看了,可能还没深入理解吧,这里我再通俗点描述下依赖注入的原理吧,尽可能滴说通俗易懂一点吧:先还是扯下概念性滴问题(概念问题我 ...
- Spring4笔记4--基于XML的DI(依赖注入)
基于XML的DI(依赖注入): Bean 实例在调用无参构造器创建了空值对象后,就要对 Bean 对象的属性进行初始化.初始化是由容器自动完成的,称为注入.根据注入方式的不同,常用的有两类:设值注入. ...
随机推荐
- Git详解之Git分支
Git 分支 几乎每一种版本控制系统都以某种形式支持分支.使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作.在很多版本控制系统中,这是个昂贵的过程,常常需要创建一个源代码目录的 ...
- 记一次金士顿DT100 G3 32G修复
修复方法参考原文:http://bbs.mydigit.cn/read.php?tid=2291146 故障描述:某天在使用时突然要求格式化,但里面有重要数据,于是想通过DG恢复出来,没想到经过这样的 ...
- css按钮固定
- JAVA-数据库之Statement对象
相关资料:<21天学通Java Web开发> 语句对象Statement1.语句对象Statement可以用来执行SQL语句,从而实现数据库操作.2.可以通过调用连接对象的createSt ...
- VMWare: eth0: error fetching interface information : device not found
VMWare: eth0: error fetching interface information : device not found 今天在VMware上新搭建的Redhat Linux 64 ...
- setOnPageChangeListener 过时了怎么办?
今天使用ViewPager发现setOnPageChangeListener的方法竟然过期了.并且AS编译不通过了,最后查了一下原来把set换成add了,代码例如以下: setOnPageChange ...
- sublime Text2下安装php code sniffer插件
为了跟团队保持开发规范的一致性,需要安装sublime Text2的php code sniffer插件,之前是用的phpfmt插件,发现两个规范还是有点不一样,需要再安装php code sniff ...
- 【WPF】树形结构TreeView的用法(MVVM)
TreeView控件的用法还是有蛮多坑点的,最好记录一下. 参考项目: https://www.codeproject.com/Articles/26288/Simplifying-the-WPF-T ...
- C语言 · 新生舞会
算法训练 新生舞会 时间限制:1.0s 内存限制:512.0MB 问题描述 新生舞会开始了.n名新生每人有三个属性:姓名.学号.性别.其中,姓名用长度不超过20的仅由大小写字母构成的 ...
- Mac配置环境变量注意点
Mac配置环境变量的地方 1./etc/profile (建议不修改这个文件 ) 全局(公有)配置,不管是哪个用户,登录时都会读取该文件. 2./etc/bashrc (一般在这个文件中添加 ...