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控制器拦截)的更多相关文章

  1. 在ASP.Net Core下,Autofac实现自动注入

    之前使用以来注入的时候,都是在xml配置对应的接口和实现类,经常会出现忘了写配置,导致注入不生效,会报错,而且项目中使用的是SPA的模式,ajax报错也不容易看出问题,经常会去排查日志找问题. 于是在 ...

  2. netcore 2.2 使用 Autofac 实现自动注入

    Autofac自动注入是通过名称约定来实现依赖注入 ps:本demo接口层都以“I”开头,以“Service”结尾.服务层实现都以“Service”结尾. 为什么要实现自动注入 大多时候,我们都是 以 ...

  3. 五)Spring + Quartz 复杂业务的两个问题:获取Spring上下文 和 自动注入服务类

    配置如下: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http:// ...

  4. Quartz.Net 与 Autofac 自动注入 的整合问题

    一.问题发现 今天早上在用 Quartz.Net 做定时扫描异常队列的功能模块时,发现处理异常队列的Job里面的ILog对象服务,Autofac没有自动注入进来. 然后在网上查阅相关资料,无奈发现 Q ...

  5. [Solution] AOP原理解析及Castle、Autofac、Unity框架使用

    本节目录: AOP介绍 AOP基本原理 AOP框架 Castle Core Castle Windsor Autofac Unity AOP介绍 面向切面编程(Aspect Oriented Prog ...

  6. AOP原理解析及Castle、Autofac、Unity框架使用

    转自:https://www.cnblogs.com/neverc/p/5241466.html AOP介绍 面向切面编程(Aspect Oriented Programming,英文缩写为AOP), ...

  7. 自己实现简单的AOP(五)使Demo适应webApi、亦可完成属性自动注入

    在前文的Demo中,webApi的Controller是不能自动注入的,原因是 IHttpController 和 IController 是通过两个不同的途径进行激活的. IHttpControll ...

  8. ASP.NET MVC Autofac自动注入

    依赖注入容器有很多插件,我用过Unity和Autofac,这两个插件给我最明显的感觉就是Autofac很快,非常的快,毕竟是第三方开发的,而Unity相对而言性能比较稳定 下面附上Autofac自动注 ...

  9. Autofac手动注入及自动注入示例

    参考:http://www.cnblogs.com/xinchuang/archive/2013/05/07/3065433.html#2911661 一.环境 vs2012.mvc4..Net Fr ...

随机推荐

  1. 面试题:filter过滤器 listener 监听器 案例有点用

    1.Filter工作原理(执行流程) 当客户端发出Web资源的请求时,Web服务器根据应用程序配置文件设置的过滤规则进行检查,若客户请求满足过滤规则,则对客户请求/响应进行拦截,对请求头和请求数据进行 ...

  2. ubuntu 设置虚拟机和主机在同一网段

    一.在VMware中将网络连接方式设置为桥接 1.打开VM菜单栏->Settings 2.在弹出的Virtual Machine Setting对话框中点击Network Adapter,在右边 ...

  3. 解决error C2365

    今天把一个FILE_BOTH_DIRECTORY_INFORMATION结构的变量,愣是写成了“enum”枚举....然后出现error C2365错误. 在CSDN上看到别人遇到问题,有人回复了“如 ...

  4. nodelet的应用

    1.创建一个包,如example_pkg catkin_create_pkg example_pkg 2.创建MyNodeletClass.h文件 cd ~/catkin_ws/src/example ...

  5. 一、office web apps 部署

    原文出处:http://www.cnblogs.com/yanweidie/p/4516164.html 原文出处:https://www.cnblogs.com/poissonnotes/p/323 ...

  6. Model View Controller (MVC) Overview

    By Rakesh Chavda on Jul 01, 2015 What is MVC?Model View Controller is a type of user interface archi ...

  7. Firefox浏览器控件安装方法

    说明:只需要安装up6.exe即可,up6.exe为插件集成安装包. 1.以管理员身份运行up6.exe.up6.exe中已经集成Chrome插件.  

  8. 设计模式03: Builder 生成器模式(创建型模式)

    Builder生成器模式(创建型模式) Builder模式缘起假设创建游戏中的一个房屋House设施,该房屋的构建由几个部分组成,且各个部分富于变化.如果使用最直观的设计方法,每个房屋部分的变化,都将 ...

  9. delphi让exe开机自启动

    procedure AutoRunOnSystemStart(Title, FileName: String);const  _Software_Microsoft_Windows_CurrentVe ...

  10. Java简单实现AOP,Java通用异常拦截,Java与Lamada

    直接看代码不废话.不懂Lamada直接百度... package test; /** * QQ:1448376744 * @author 花间岛 * */ //控制器 public class Con ...