castle.core包及其用法

49 阅读2分钟

Castle.Core 是一个常用的 .NET 类库,主要用于支持动态代理、依赖注入和拦截等高级编程技术。它的核心功能包括:

  • 动态代理(Dynamic Proxy):可以在运行时生成对象的代理,用于 AOP(面向切面编程)、方法拦截、日志记录等场景。

  • 依赖注入支持:是 Castle Windsor(一个流行的依赖注入容器)的底层依赖库。

  • 通用工具类:包含一些辅助工具,比如线程安全集合、事件处理等。

常见用途:

  • 在单元测试中模拟(Mock)对象行为。

  • 在应用程序中实现方法拦截、日志、权限校验等横切关注点。

  • 作为依赖注入框架的基础设施。

如果你的项目用到了依赖注入、AOP 或需要动态生成代理对象,通常会用到 Castle.Core。  

更多信息可参考官方文档:Castle Project

好的,下面分别给出基于 Castle.Core 包的 AOP(方法拦截)和动态代理的简单示例。


1. AOP(方法拦截)示例

通过 Castle.DynamicProxy 实现方法拦截(AOP),比如在方法执行前后打印日志:

using Castle.DynamicProxy;
using System;

public class LoggingInterceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        Console.WriteLine("方法开始: " + invocation.Method.Name);
        invocation.Proceed(); // 执行原方法
        Console.WriteLine("方法结束: " + invocation.Method.Name);
    }
}

public interface IService
{
    void DoWork();
}

public class Service : IService
{
    public void DoWork()
    {
        Console.WriteLine("正在工作...");
    }
}

class Program
{
    static void Main()
    {
        var proxyGenerator = new ProxyGenerator();
        var service = proxyGenerator.CreateInterfaceProxyWithTarget<IService>(
            new Service(),
            new LoggingInterceptor());

        service.DoWork();
    }
}

输出:

方法开始: DoWork
正在工作...
方法结束: DoWork

2. 动态代理示例

通过 Castle.DynamicProxy 动态生成一个类的代理对象,并拦截其方法:

using Castle.DynamicProxy;
using System;

public class SimpleInterceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        Console.WriteLine("拦截到方法: " + invocation.Method.Name);
        invocation.Proceed();
    }
}

public class Person
{
    public virtual void SayHello()
    {
        Console.WriteLine("Hello!");
    }
}

class Program
{
    static void Main()
    {
        var proxyGenerator = new ProxyGenerator();
        var personProxy = proxyGenerator.CreateClassProxy<Person>(new SimpleInterceptor());

        personProxy.SayHello();
    }
}

输出:

拦截到方法: SayHello
Hello!

说明:

  • 两个例子都用到了 Castle.DynamicProxy(属于 Castle.Core 包)。
  • 第一个例子是接口代理,常用于 AOP 场景。
  • 第二个例子是类代理,展示了动态代理的基本用法。

如需更复杂的应用,可以结合依赖注入框架或自定义拦截逻辑。