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 场景。
- 第二个例子是类代理,展示了动态代理的基本用法。
如需更复杂的应用,可以结合依赖注入框架或自定义拦截逻辑。