[原创]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 ...
随机推荐
- Luogu 3237 [HNOI2014]米特运输
BZOJ 3573 发现当一个点的权值确定了,整棵树的权值也会随之确定,这个确定关系表现在根结点的总权值上,如果一个点$x$的权值为$v$,那么一步步向上跳后,到根节点的权值就会变成$x*$每一个点的 ...
- Luogu 2403 [SDOI2010]所驼门王的宝藏
BZOJ 1924 内存要算准,我MLE了两次. 建立$n + r + c$个点,对于一个点$i$的坐标为$(x, y)$,连边$(n + x, i)$和$(n + r + y, i)$,代表这一列和 ...
- jqentitydetail
using System;using System.Collections;using System.Collections.Generic;using System.Linq;using Syste ...
- 列表推导式对比For循环执行效率
我们在前面的学习中都知道,如果把1-10以内的元素追加到一个新的列表表中,如果使用for循环我们可以这么做: a = [] for i in range(1,11): a.append(i) prin ...
- 第18章-使用WebSocket和STOMP实现消息功能
Spring 4.0为WebSocket通信提供了支持,包括: 发送和接收消息的低层级API: 发送和接收消息的高级API: 用来发送消息的模板: 支持SockJS,用来解决浏览器端.服务器以及代理不 ...
- (转)C# HTML解析示例---星星引发的血案
原文地址:http://www.cnblogs.com/wurang/archive/2013/06/14/3119023.html [前言] 从CSDN转投cnBlog也有一段时间了,发现cnBlo ...
- EasyUI学习笔记(1)----Tree控件实现过程中.NET下无法访问json数据的解决办法
直接调用官网的Demo中的方法 , 将json数据存储在同目录下,但是在运行之后树没有出现,用FireBug调试,错误如下 不允许访问json数据,刚开始以为是权限不够,然后又给解决方案所在的文件夹设 ...
- laravel中get方式表单提交后, 地址栏数据重复的问题
csrf_field这个要放form表单下面第一行的位置
- JAVA8 Lambda 表达式使用心得
List<HashMap> 指定数据求和: List<HashMap> kk = new ArrayList<>(); Map mmm = new H ...
- C# 继承(3)
接上章代码: class NameList { public NameList() => Console.WriteLine("这个是NameList的构造函数"); ~Na ...