Castle.Windsor IOC/AOP的使用
Castle最早在2003年诞生于Apache Avalon项目,目的是为了创建一个IOC(控制反转)框架。发展到现在已经有4个组件了,分别是ActiveRecord(ORM组件)、Windsor(IOC组件)、DynamicProxy(动态代理组件)、MonoRail(Web MVC组件)。
这里我们要学习的是Windsor组件,Windsor是Castle提供的一个IOC框架。
使用之前,首先需要引用两个DLL,分别是:Castle.Core 和 Castle.Windsor。
IOC(控制反转)框架
为了演示,我们创建ILogger接口和对应的实现类ConsoleLogger
public interface ILogger
{
void Debug(string msg);
}
public class ConsoleLogger : ILogger
{
public void Debug(string msg)
{
Console.WriteLine("Console Debug :" + msg);
}
}
现在我们可以对IOC容器进行配置(本篇只讲代码配置,XML的配置可以参考官方文档:http://docs.castleproject.org/Windsor.XML-Registration-Reference.ashx),步骤只需要两步:
第一步:创建安装类,所有的安装类必须继承自IWindsorInstaller
public interface IWindsorInstaller
{
void Install(IWindsorContainer container, IConfigurationStore store);
}
接口中定义的Install方法用于执行容器里具体类的注册(将需要加入到容器控制的接口及对应的实现注册到容器中)
public class MyInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Component.For<ILogger>().ImplementedBy<ConsoleLogger>().LifestyleSingleton()); // //CastleWindsor.IEntity是实现类所在的空间
// container.Register(Classes.FromThisAssembly().InNamespace("CastleWindsor.IEntity").WithService.DefaultInterfaces()); // //继承两个接口
// container.Register(
// Component.For<IUserRepository, IRepository>()
// .ImplementedBy<MyRepository>()
// ); // //简单工厂
// container
// .Register(
// Component.For<IMyService>()
// .UsingFactoryMethod(
// () => MyLegacyServiceFactory.CreateMyService())
// ); // //泛型配置
// container.Register(
// Component.For(typeof(IRepository<>)
// .ImplementedBy(typeof(NHRepository<>)
// ); // //实体生命周期
// container.Register(
// Component.For<IMyService>()
// .ImplementedBy<MyServiceImpl>()
// .LifeStyle.Transient
// .Named("myservice.default")
// ); // //取先注册的
// container.Register(
// Component.For<IMyService>().ImplementedBy<MyServiceImpl>(),
// Component.For<IMyService>().ImplementedBy<OtherServiceImpl>()
// ); // //强制取后注册的
// container.Register(
// Component.For<IMyService>().ImplementedBy<MyServiceImpl>(),
// Component.For<IMyService>().Named("OtherServiceImpl").ImplementedBy<OtherServiceImpl>().IsDefault()
// ); // //注册已经存在的
// var customer = new CustomerImpl();
// container.Register(
// Component.For<ICustomer>().Instance(customer)
// ); }
}
第二步:在容器初始化的时候加载安装类
public class WindsorInit
{
private static WindsorContainer _container;
public static WindsorContainer GetContainer()
{
if (_container == null)
{
_container = new WindsorContainer();
_container.Install(
new MyInstaller()
);
}
return _container;
} public void CloseContex()
{
_container.Dispose();
}
}
客户端在使用的时候进行如下调用:
ILogger logger = WindsorInit.GetContainer().Resolve<ILogger>();
logger.Debug("记录日志");
在需要从容器中获取特定类的时候,只需调用container.Resolve 即可获取特定的实现类
AOP拦截器
AOP就是可以在一个已有的类方法中动态地嵌入代码,可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能。前提必须是被切入的类是通过IOC容器来控制的。
Castle通过DynamicProxy来实现动态代理每一个切面方法均需要实现接口IInterceptor。
下面通过代码的方式来学习下AOP,新建一个切入类
public class LoggingInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
Console.WriteLine("方法前调用");
try
{
invocation.Proceed();
}
catch (Exception)
{
Console.WriteLine("方法出错调用");
throw;
}
finally
{
Console.WriteLine("方法最后调用");
}
}
}
即在原来的方法中加入TryCatch块,并记录日志。客户端调用的时候只需要在类上加标签:
[Interceptor(typeof(LoggingInterceptor))]
public class PersonAppService : IPersonAppService
{
public void CreatePerson(string name, int age)
{
// todo
}
}
前提是PersonAppService这个类是受Windsor IOC容器控制的。
这样在PersonAppService每个方法外面均会套上TryCatch并记录日志。
Castle.Windsor IOC/AOP的使用的更多相关文章
- Castle Windsor Ioc 一个接口多个实现解决方案
介绍 Castle Windsor 是微软的Ioc类库,本文主要介绍解决一个接口多个实现的解决方案 接口和类 以下内容不是真实的实际场景,仅仅是提供解决一个接口多个实现的思路. 业务场景类 先假设有一 ...
- Aspect Oriented Programming using Interceptors within Castle Windsor and ABP Framework AOP
http://www.codeproject.com/Articles/1080517/Aspect-Oriented-Programming-using-Interceptors-wit Downl ...
- 小白初学Ioc、DI、Castle Windsor依赖注入,大神勿入(不适)
过了几天,我又来了.上一篇中有博友提到要分享下属于我们abp初学者的历程,今天抽出点时间写写吧.起初,我是直接去看阳光铭睿的博客,看了一遍下来,感觉好多东西没接触过,接着我又去下了github 里面下 ...
- IoC - Castle Windsor 2.1
找过一些Windsor教程的文章,博客园上TerryLee有写了不少,以及codeproject等也有一些例子,但都讲的不太明了.今天看到Alex Henderson写的一个系列,非常简单明了.下面是 ...
- 多个IoC容器适配器设计及性能测试(Castle.Windsor Autofac Spring.Core)
[转]多个IoC容器适配器设计及性能测试和容器选择 1. 采用的IoC容器和版本 Autofac.2.6.3.862 Castle.Windsor.3.1.0 Spring.Core.2.0.0 2. ...
- .net aop 操作 切面应用 Castle.Windsor框架 spring 可根据接口 自动生成一个空的实现接口的类
通过unget 安装Castle.Windsor using Castle.DynamicProxy; using System; using System.Collections.Generic; ...
- Castle Windsor常用介绍以及其在ABP项目的应用介绍
最近在研究ABP项目,有关ABP的介绍请看阳光铭睿 博客,ABP的DI和AOP框架用的是Castle Windsor下面就对Castle Windsor项目常用方法介绍和关于ABP的使用总结 1.下载 ...
- 在ABP项目的应用Castle Windsor
Castle Windsor常用介绍以及其在ABP项目的应用介绍 最近在研究ABP项目,有关ABP的介绍请看阳光铭睿 博客,ABP的DI和AOP框架用的是Castle Windsor下面就对Castl ...
- 使用Castle DynamicProxy (AOP)
在本文中,我将引导您了解.NET环境中的面向方面编程(AOP)概念,以及如何使用Castle DynamicProxy创建和附加方面.在我们开始之前,让我快速介绍AOP和 IoC.如果您已经熟悉这些 ...
随机推荐
- 如何查看yum安装路径
#yum install hdf5 #rpm -qa|grep hdf5 hdf5-1.8.7-1.el6.rf.x86_64 #rpm -ql hdf5-1.8.7-1.el6.rf.x86_64
- 《LeetBook》leetcode题解(9):Palindrome Number[E]——回文数字
我现在在做一个叫<leetbook>的开源书项目,把解题思路都同步更新到github上了,需要的同学可以去看看 地址:https://github.com/hk029/leetcode 这 ...
- orcale 之pl/sql例外
orcale 中的例外我们可以看作是其他编程语言中的异常,是为了增强语言的健壮性和容错性. 在orcale中常见的有以下几种: No_data_found 很容易理解就是没有数据返回. Too_man ...
- 16G的U盘 4G的压缩
文件系统格式原因,或是你的U盘是扩容盘(就是实际容量和显示的不一样)常用文件系统支持的单个文件大小: FAT16 支持单个文件最大不超过2GB FAT32 支持单个文件最大不超过4GB(有人说实际超过 ...
- 利用OC对象的消息重定向forwardingTargetForSelector方法构建高扩展性的滤镜功能
在OC中,当像一个对象发送消息,而对象找到消息后,从它的类方法列表,父类方法列表,一直找到根类方法列表都没有找到与这个选择子对应的函数指针.那么这个对象就会触发消息转发机制. OC对象的继承链和isa ...
- mysql-5.6.31安装(单实例 Linux)
安装版本:mysql-5.6.31 安装环境:Linux RHEL6.5.x86 安装要求:单实例,端口为默认:3306 (1) 要求安装Mysql数据库版本号及包名为:my ...
- 安装caffe(opencv3+anaconda3)
目录 仅安装CPU版本的caffe 1.下载相关的依赖包: 2.安装opencv3 3.安装caffe 参考文献: 仅安装CPU版本的caffe 1.下载相关的依赖包: sudo apt-get in ...
- 编译可移植的python
1. 在低版本系统机器上,编译python: cd Python-2.7.15/Modules vim Setup.dist 修改下述代码: ########### sed -i 's/#SSL=\/ ...
- SQL 之相关语法及操作符
概述:UNION.SELECT INTO.INSERT INTO SELECT.SQL 约束. UNION操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,UNION ...
- HDFS学习
HDFS体系结构 HDFS采用了主从(Master/Slave)结构模型,一个HDFS集群包括一个名称节点(NameNode)和若干个数据节点(DataNode)(如图所示).名称节点作为中心服务器, ...