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.如果您已经熟悉这些 ...
随机推荐
- ECharts概念学习系列之ECharts是什么?
不多说,直接上干货! http://echarts.baidu.com/index.html http://echarts.baidu.com/echarts2/index.html 开源的EChar ...
- Steps to install Docker on Manjaro 16.10--转
https://manjaro-tutorial.blogspot.com/2016/12/how-to-install-docker-on-manjaro-1610.html Open Termin ...
- MySQL的连接方式
连接MySQL操作是连接进程和MySQL数据库实例进行通信.从开发的角度来说,本质上是进程通信.常用的进程通信方式有管道.命名管道.命名字.TCP/IP套接字.Unix域名套接字.MySQL提供的连接 ...
- WPF的ItemsControl设置数据源以及Binding使用
Student类: using System; using System.Collections.Generic; using System.Linq; using System.Text; usin ...
- DIY党的福利!鹅厂程序员教你200元以内制作专属分体键盘
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由VellHe发表于云+社区专栏 前言 作为一名程序员,键盘在手,天下我有啊,不整把高大上的键盘怎么提升B格.之前一直想买个机械键盘,听 ...
- Maven Oracle JDBC
Oracle的JDBC驱动程序无法从公共仓库下载,你只能手动部署Oracle JDBC驱动程序到本地库.命令如下: mvn install:install-file -Dfile={ORACLE_HO ...
- 每天一道leetcode234-回文链表
考试结束,班级平均分只拿到了年级第二,班主任于是问道:大家都知道世界第一高峰珠穆朗玛峰,有人知道世界第二高峰是什么吗?正当班主任要继续发话,只听到角落默默想起来一个声音:”乔戈里峰” 前言 2018. ...
- git常用小操作。-- 自用
编辑 .gitignore bin-debug/ 忽略所有的叫bin-debug文件夹和他下面的文件 编辑 .git/config [core] repositoryformatversion = ...
- 给Solr配置中文分词器
第一步下载分词器https://pan.baidu.com/s/1X8v65YZ4gIkNQXsXfSULBw 第二歩打开已经解压的ik分词器文件夹 将ik-analyzer-solr5-5.x.ja ...
- 在Ubuntu16.04.4和Windows10上安装jdk
在Ubuntu16.04.4和Windows10上安装jdk 一.在Ubuntu16.04.4上安装jdk 1.下载jdk安装包 首先我们在oracle官网上下载jdk-8u161-linu ...