[原创]Aop之使用Autofac+Castle 自动注入服务且动态代理服务实现拦截(非MVC控制器拦截)
public static class AutofacComponentManualRegister
{
/// <summary>
/// 注册
/// </summary>
/// <param name="builder">bundles</param>
public static IContainer RegisterIOC()
{
ContainerBuilder builder = new ContainerBuilder();
//构造函数注入
builder.RegisterAssemblyTypes(Assembly.GetCallingAssembly()).AsImplementedInterfaces();
//注入控制器并实现属性注入
builder.RegisterControllers(Assembly.GetCallingAssembly());
//支持过滤器的属性注入-
builder.RegisterFilterProvider(); builder.RegisterType<MemoryCacheProvider>().As<ICacheProvider>().SingleInstance();
builder.RegisterType<AppService>().As<IAppService>().EnableAop(typeof(IAppService));
builder.RegisterType<ProductService>().As<IProductService>().SingleInstance();
builder.RegisterType<CustomerService>().As<ICustomerService>().SingleInstance();
builder.RegisterType<UserService>().As<IUserService>().SingleInstance();
var registration = builder.RegisterType<SaleOrderService>().As<ISaleOrderService>().SingleInstance(); var container = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); return container;
} private static void EnableAop<TLimit, TActivatorData, TSingleRegistrationStyle>(this IRegistrationBuilder<TLimit, TActivatorData, TSingleRegistrationStyle> registrationBuilder,Type type)
{
registrationBuilder.RegistrationData.ActivatingHandlers.Add((sender, e) =>
{
try
{
e.Instance = proxyGenerator.CreateInterfaceProxyWithTarget(type, e.Instance, new LogInterceptor());
}
catch (Exception ex)
{ }
});
} static readonly ProxyGenerator proxyGenerator = new ProxyGenerator();
}
2.拦截类
public class LogInterceptor : IInterceptor
{
/// <summary>
/// logger
/// </summary>
private static readonly ILog Logger = LogManager.GetLogger(typeof(LogInterceptor)); public LogInterceptor()
{
}
public void Intercept(IInvocation invocation)
{
var request = JsonConvert.SerializeObject(invocation.Arguments);
if (invocation.Arguments.Length > && invocation.Arguments[] is Request)
{
Logger.DebugFormat("请求服务名:{0} 方法名:{1} 请求参数:{2}", invocation.TargetType, invocation.Method.Name, request);
invocation.Proceed();
var resp = invocation.ReturnValue;
var response = JsonConvert.SerializeObject(resp);
Logger.DebugFormat("请求服务名:{0} 方法名:{1} 返回参数:{2}", invocation.TargetType, invocation.Method.Name, response);
}
else
{
invocation.Proceed();
Logger.ErrorFormat("非法请求:{0}",request);
}
}
}
3.
/// <summary>
/// IAppService
/// </summary>
[ServiceContract]
public interface IAppService
{
/// <summary>
/// APP后端获取标接口
/// </summary>
/// <returns></returns>
[OperationContract]
IsAliveResp IsAlive(IsAliveReq req); }
4.
public class AppService : IAppService
{
#region field
/// <summary>
/// IBatis访问DB接口
/// </summary>
private readonly ISqlMapper _mapper; /// <summary>
/// logger
/// </summary>
private static readonly ILog Logger = LogManager.GetLogger(typeof(AppService));
#endregion #region .ctor
/// <summary>
/// App服务接口(对App端)
/// </summary>
public AppService()
{
this._mapper = SqlMap.Instance();
}
#endregion #region public /// <summary>
/// 获取商品列表
/// </summary>
/// <returns></returns>
public IsAliveResp IsAlive(IsAliveResp req)
{
var result = this._mapper.QueryForObject<DateTime>("queryCurrentTimeFromDatabase", null); return new IsAliveResp()
{
Success = true,
Time = result.ToString("yyyy-MM-dd HH:mm:ss.fff")
};
}
}
对EnableAop改进,支持自动获取相应的接口类,并传入拦截器数组
private static void EnableAop<TLimit, TActivatorData, TSingleRegistrationStyle>(this IRegistrationBuilder<TLimit, TActivatorData, TSingleRegistrationStyle> registrationBuilder,params IInterceptor[] types)
{
registrationBuilder.RegistrationData.ActivatingHandlers.Add((sender, e) =>
{
try
{
var serviceWithTypes =
e.Component.Services.OfType<IServiceWithType>().Select(x => x.ServiceType).ToList();
if (serviceWithTypes.Count == )
{
e.Instance = proxyGenerator.CreateInterfaceProxyWithTarget(serviceWithTypes[], e.Instance, types);
} }
catch (Exception ex)
{ }
});
}
5.对于wcf服务无法调用控制器的拦截器(ActionFilter),所以可以调用该服务时就自动实现了拦截
6.下一步改进,在EnableAop()里可以无需传入类型参数,而代替的是IInterceptor[] 参数
7.如果可以实现特性就更优雅了
[原创]Aop之使用Autofac+Castle 自动注入服务且动态代理服务实现拦截(非MVC控制器拦截)的更多相关文章
- 在ASP.Net Core下,Autofac实现自动注入
之前使用以来注入的时候,都是在xml配置对应的接口和实现类,经常会出现忘了写配置,导致注入不生效,会报错,而且项目中使用的是SPA的模式,ajax报错也不容易看出问题,经常会去排查日志找问题. 于是在 ...
- netcore 2.2 使用 Autofac 实现自动注入
Autofac自动注入是通过名称约定来实现依赖注入 ps:本demo接口层都以“I”开头,以“Service”结尾.服务层实现都以“Service”结尾. 为什么要实现自动注入 大多时候,我们都是 以 ...
- 五)Spring + Quartz 复杂业务的两个问题:获取Spring上下文 和 自动注入服务类
配置如下: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http:// ...
- Quartz.Net 与 Autofac 自动注入 的整合问题
一.问题发现 今天早上在用 Quartz.Net 做定时扫描异常队列的功能模块时,发现处理异常队列的Job里面的ILog对象服务,Autofac没有自动注入进来. 然后在网上查阅相关资料,无奈发现 Q ...
- [Solution] AOP原理解析及Castle、Autofac、Unity框架使用
本节目录: AOP介绍 AOP基本原理 AOP框架 Castle Core Castle Windsor Autofac Unity AOP介绍 面向切面编程(Aspect Oriented Prog ...
- AOP原理解析及Castle、Autofac、Unity框架使用
转自:https://www.cnblogs.com/neverc/p/5241466.html AOP介绍 面向切面编程(Aspect Oriented Programming,英文缩写为AOP), ...
- 自己实现简单的AOP(五)使Demo适应webApi、亦可完成属性自动注入
在前文的Demo中,webApi的Controller是不能自动注入的,原因是 IHttpController 和 IController 是通过两个不同的途径进行激活的. IHttpControll ...
- ASP.NET MVC Autofac自动注入
依赖注入容器有很多插件,我用过Unity和Autofac,这两个插件给我最明显的感觉就是Autofac很快,非常的快,毕竟是第三方开发的,而Unity相对而言性能比较稳定 下面附上Autofac自动注 ...
- Autofac手动注入及自动注入示例
参考:http://www.cnblogs.com/xinchuang/archive/2013/05/07/3065433.html#2911661 一.环境 vs2012.mvc4..Net Fr ...
随机推荐
- launchpad, jira, github
一.简介 http://segmentfault.com/q/1010000000165115
- Luogu 3665 [USACO17OPEN]Switch Grass 切换牧草
BZOJ 4777 被权限了. 这道题的做法看上去不难,但是感觉自己yy不出来. 首先是两个结论: 1.答案一定是连接着两个异色点的一条边. 2.答案一定在最小生成树上. 感觉看到了之后都比较显然,自 ...
- 黑盒测试实践--Day3 11.27
黑盒测试实践--Day3 今天完成任务情况: 收到小组紧急通知,作业要求更新了.组长召集大家在下午课后去开个短会,会议信息如下: 时间:11.27 晚上5:30 地点:东九楼501 会议内容: 学习了 ...
- System.Web.UI.Page事件执行顺序
#region OnPreInit 第一步(显式重写,文章下面有隐式重写) protected override void OnPreInit(EventArgs e) { //检查 IsPostBa ...
- 命令之 ulimit
help ulimit help ulimit ulimit: ulimit [-SHacdefilmnpqrstuvx] [limit] Modify shell resource limits. ...
- (转)Entity Framework 5.0系列之自动生成Code First代码
原文地址:http://www.cnblogs.com/kenshincui/archive/2013/08/29/3290527.html 在前面的文章中我们提到Entity Framework的“ ...
- poj2002 Squares(hash+折半枚举)
Description A square is a 4-sided polygon whose sides have equal length and adjacent sides form 90-d ...
- java实现wc功能
github项目地址:https://github.com/3216004717/ruanjiangongcheng.git 项目相关要求 基本要求 wc.exe -c file.c //返回文件 f ...
- 所谓IIS未注册引起的故障及解决
- WinForm中的多线程
使用BeginInvoke或Invoke 作用 在自己创建的非UI线程中,进行UI操作,比如更新UI上控件的状态. Windows 窗体中的控件被绑定到特定的线程,不具备线程安全性.因此,如果从另一个 ...