项目使用的是微软的IOC容器,但是AOP代理使用Castle。
步骤
1. 使用Castle(使用虚方法或接口)
(1)添加虚方法或接口修饰需要被代理的方法和类 (2)定义拦截器:假设日志记录工具 (3)使用Castle容器将拦截器和被代理对象关联
2.使用IOC容器
3.微软IOC容器从Castle容器中获取代理对象
(1) 注册解析器:告知Castle容器从微软IOC容器中获取对象
(2) 1. (3)
(3)使用工厂模式将Castle对象放入微软IOC容器中
伪代码实现
IServiceProvider sp;
ServiceCollection sc;
//注册IOC/DI容器
//..........
//.........
sp= sc.Build();
var wContainer = new WindsorContainer();
wContainer.Kernel.Resolver.AddSubResolver(new MicroIOCDIDependcyResolver(sp));
//注册代理对象和拦截器
//将Castle对象注册到IOC容器中
foreach(var handler in wContainer.Component.Services.GetAssignHandlers(typeof(object)))
{
var serviceType = handler.Component.Services.First();
var impleType = handler.Component.Implementation;
if(handler.ComponentModel.LiftStyle == Singleton){
services.AddSingleton(serviceType,provider=>container.resolve(serviceType))
}
......Scoped
......Transiented
}
//调用
sp.GetService<SomeClass>();