[原创]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 ...
随机推荐
- 41、OrthoMCL和mcl软件进行基因家族分析
转载:http://www.realbio.cn/news/124.html https://blog.csdn.net/seallama/article/details/43820763 http: ...
- selenium+phantomjs解析JS
背景知识: PhantomJS 是一个基于WebKit的服务器端 JavaScript API.它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, CSS 选择器, J ...
- Robot Framework - 基础关键字 BuiltIn 库(二)
本篇教程,我们继续接着上篇内容进行讲解,我们本节教程讲解的是Robot Framework 机器人框架中的变量中使用判断.字符串的拼接.Evaluate的用法.调用Python文件.条件分支语句.以及 ...
- (一)ASP.NET中JavaScript的中英文(多语言)实现方案
PS: https://github.com/hzlzh/Front-End-Standards/wiki/HTML-CSS-JS-i18n 本文原始思路起源于此网址,请自行查看. 本文只是简单的一个 ...
- /dev/null 位桶
把/dev/null看作"黑洞". 它非常等价于一个只写文件. 所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到. 然而, /dev/null对命令行和脚本都非 ...
- HTML5 Canvas核心技术:图形、动画与游戏开发 PDF扫描版
HTML5 Canvas核心技术:图形.动画与游戏开发 内容简介: <HTML5 Canvas核心技术:图形.动画与游戏开发>中,畅销书作家David Geary(基瑞)先生以实用的范例程 ...
- [.net 多线程] Interlocked实现CAS操作
Interlocked:为多个线程共享的变量提供原子操作. Interlocked.Increment(ref value) 数值加一(原子性操作) Interlocked.Decrement(ref ...
- 游戏中遇到的BUG
(1)bug描述:战斗中有英雄死亡,一方掉线之后再次上线,仍然可以看到死亡英雄空血条(英雄受到攻击才会显示血条) 解决方案:原来 当前血量小于英雄血量最大值时,证明英雄受到伤害,血条显示为true I ...
- asp.netcore+jenkins+docker+svn+centos7.2 持续集成,每天凌晨获取最新代码打包发布
运行环境: centos7.2服务器或则虚拟机 可以是腾讯云也可以是内网服务器,(如果是内网服务器需要用frp做内网穿透,这样才可以通过外网访问该服务器) svnserver 来托管代码 一.安装je ...
- [Algorithm]查找
一.查找的算法 1.顺序查找 1 int Search_Seq( SeqList L, ElemType elem ) 2 { 3 L.elem[0] = elem; 4 for ( int i = ...