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.如果您已经熟悉这些 ...
随机推荐
- ListView性能优化——convertView&viewHolder
ListView优化大致从以下几个角度:1.复用已经生成的convertView:2.添加viewHolder类:3.缓存数据(图片缓存):4.分页加载. 具体方案: 1.如果自定义适配器,那么在ge ...
- python 四种单例模式
1 使用__new__方法 Python class Singleton(object): def __new__(cls, *args, **kw): if not hasattr(cls, '_i ...
- 有关查询和执行计划的DMV
转自:http://www.cnblogs.com/CareySon/archive/2012/05/17/2506035.html 查看被缓存的查询计划 SET TRANSACTION ISOLAT ...
- TypeScript的简单介绍和win环境安装
TypeScript是一种由微软开发的自由和开源的编程语言.它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程.特点是一门强类型语言. 安装: 1 首先 ...
- Django 中文文档地址
http://djangobook.py3k.cn/2.0/ MK一下
- [转]bootstrap-datetimepicker 火狐浏览器报错
本文转自:https://segmentfault.com/a/1190000008457568 使用bootstrap-datetimepicker日期选择插件时发现在火狐浏览器下报错: 未压缩版报 ...
- Spring系列之——使用模板快速搭建springboot项目
1 在官网https://start.spring.io/生成spring boot的模板 2 IDEA导入模板,设置如下勾选项,其他选项卡为默认值 3 idea呈现 4 新增controller类 ...
- sql语句中as的意思是什么?
as 一般用在两个地方,一个是query的时候,用来重新指定返回的column(列) 名字如:一个table 有个column叫 id, 我们的query是select id from table1. ...
- Github+hexo+next搭建教程
今天参考的是大神的教程,学了一个新东西,但是可能由于原教程中运用的npm包与我当前使用的npm包版本不同的原因,有出过多处运行错误,但都在此教程中解决了; 总结了下命令: npm install he ...
- Luogu2483 [SDOI2010]魔法猪学院(可并堆)
俞鼎力大牛的课件 对于原图以 \(t\) 为根建出任意一棵最短路径树 \(T\),即反着从 \(t\) 跑出到所有点的最短路 \(dis\) 它有一些性质: 性质1: 对于一条 \(s\) 到 \(t ...