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的使用的更多相关文章

  1. Castle Windsor Ioc 一个接口多个实现解决方案

    介绍 Castle Windsor 是微软的Ioc类库,本文主要介绍解决一个接口多个实现的解决方案 接口和类 以下内容不是真实的实际场景,仅仅是提供解决一个接口多个实现的思路. 业务场景类 先假设有一 ...

  2. 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 ...

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

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

  4. IoC - Castle Windsor 2.1

    找过一些Windsor教程的文章,博客园上TerryLee有写了不少,以及codeproject等也有一些例子,但都讲的不太明了.今天看到Alex Henderson写的一个系列,非常简单明了.下面是 ...

  5. 多个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. ...

  6. .net aop 操作 切面应用 Castle.Windsor框架 spring 可根据接口 自动生成一个空的实现接口的类

    通过unget 安装Castle.Windsor using Castle.DynamicProxy; using System; using System.Collections.Generic; ...

  7. Castle Windsor常用介绍以及其在ABP项目的应用介绍

    最近在研究ABP项目,有关ABP的介绍请看阳光铭睿 博客,ABP的DI和AOP框架用的是Castle Windsor下面就对Castle Windsor项目常用方法介绍和关于ABP的使用总结 1.下载 ...

  8. 在ABP项目的应用Castle Windsor

    Castle Windsor常用介绍以及其在ABP项目的应用介绍 最近在研究ABP项目,有关ABP的介绍请看阳光铭睿 博客,ABP的DI和AOP框架用的是Castle Windsor下面就对Castl ...

  9. 使用Castle DynamicProxy (AOP)

    在本文中,我将引导您了解.NET环境中的面向方面编程(AOP)概念,以及如何使用Castle DynamicProxy创建和附加方面.在我们开始之前,让我快速介绍AOP和  IoC.如果您已经熟悉这些 ...

随机推荐

  1. Java 8学习之Stream API

    一个Stream表面上看与一个集合很类似,允许你改变和获取数据.但是实际上他与集合是有很大区别的: Stream自己不会存储元素.元素可能被存储在底层的集合中,或者根据需要产生出来. Stream操作 ...

  2. Jmeter创建一个点对点的 JMS 测试计划

    创建一个点对点的 JMS 测试计划 确保所需的jar文件位于JMeter lib目录中. 如果没有,关闭JMeter,复制jar文件并重新启动JMeter. 参见详细教程 在本节中,将学习如何创建测试 ...

  3. PHP之mb_substr_count使用

    mb_substr_count (PHP 4 >= 4.3.0, PHP 5, PHP 7) mb_substr_count - Count the number of substring oc ...

  4. ado.net中的 sqlconnection sqlcommand datareader dataset SqlDataAdapter之间的关系

    Connection: 和数据库交互,必须连接它.连接帮助指明数据库服务器.数据库名字.用户名.密码,和连接数据库所需要的其它参数.Connection对象会被Command对象使用,这样就能够知道是 ...

  5. [SQL Server] 无法连接到本地数据库

    打开SQL Server配置管理器 启用下图两个协议 打开SQL Server服务 这一步可能出现这种情况: 故障原因是,安装Visual Studio 2012的时候,自动安装“Microsoft ...

  6. Python——基本的方法

    格式化 我们经常会输出类似'亲爱的xxx你好!你xx月的话费是xx,余额是xx'之类的字符串,而xxx的内容都是根据变量变化的,所以,需要一种简便的格式化字符串的方式 >>> 'He ...

  7. ASP.NET中让图片以二进制的形式存储在数据库中

    今早有个网友问到我这问题,以前我都是直接在数据库中存文件名的,还没有试过存储整张图片到数据库中,上网搜索了一下,自己又测试了一番,代码如下:建立保存图片的表的SQL语句: USE [niunantes ...

  8. Cheatsheet: 2018 04.01 ~ 04.30

    Web Writing VS Code Extensions with TypeScript Docker How to write excellent Dockerfiles Raspberry P ...

  9. [javaSE] 网络编程(浏览器客户端-自定义服务端)

    获取ServerSocket对象,new出来构造参数:int类型端口号 调用ServerSocket对象的accept()方法,得到Socket对象 获取PrintWriter对象,new出来,构造参 ...

  10. 撩课-Mysql详解第3部分sql分类

    学习地址:[撩课-JavaWeb系列1之基础语法-前端基础][撩课-JavaWeb系列2之XML][撩课-JavaWeb系列3之MySQL][撩课-JavaWeb系列4之JDBC][撩课-JavaWe ...