zoukankan      html  css  js  c++  java
  • ASP.NET Core 整合Autofac和Castle实现自动AOP拦截

    前言:

    除了ASP.NETCore自带的IOC容器外,我们还可以使用其他成熟的DI框架,如Autofac,StructureMap等(笔者只用过Unity,Ninject和Castle)。

    1.ASP.NET Core中的Autofac

    首先在Project.jsonDependency节点为中添加如下引用:

     "Microsoft.Extensions.DependencyInjection": "1.0.0",
     "Autofac": "4.1.1",
     "Autofac.Extensions.DependencyInjection": "4.0.0",

    接着我们也修改Startup文件中的ConfigureServices方法,为了接管默认的DI,我们要为函数添加返回值AutofacServiceProvider;

    1.1 ConfigureServices函数

    public IServiceProvider ConfigureServices(IServiceCollection services)
    {
         services.AddApplicationInsightsTelemetry(Configuration);
         services.AddMvc();
         return RegisterAutofac(services);
    }

    1.2 RegisterAutofac函数

    private IServiceProvider RegisterAutofac(IServiceCollection services)
    {
         var builder = new ContainerBuilder();
         builder.Populate(services);
         var assembly = this.GetType().GetTypeInfo().Assembly;
         builder.RegisterType<AopInterceptor>();
         builder.RegisterAssemblyTypes(assembly)
                      .Where(type =>
                       typeof(IDependency).IsAssignableFrom(type) && !type.GetTypeInfo().IsAbstract)
                      .AsImplementedInterfaces()
                      .InstancePerLifetimeScope().EnableInterfaceInterceptors().InterceptedBy(typeof(AopInterceptor));
          this.ApplicationContainer = builder.Build();
          return new AutofacServiceProvider(this.ApplicationContainer);
    }

    这里IDependency接口是一个空接口,为了扫描到实现这个接口的类,自动完成注入操作。

    2.整合Castle的DynamicProxy

    要实现整合,只需要上面函数中,这段代码:

    .EnableInterfaceInterceptors().InterceptedBy(typeof(AopInterceptor));

    2.2 引用程序集

    显然些程序集还没有Core的对应版本的Autofac.Extras.DynamicProxy,既然说好要整合,就修改一下源代码吧。

    Autofac.Extras.DynamicProxy之所以不能支持Core,主要是因为在源码中没有使用新的反射API,GetTypeInfo或使用了一些Remoting的API导致的。

    支持Core的Autofac.Extras.DynamicProxy源代码内容和Demo的Github地址如下:

    https://github.com/maxzhang1985/AutofacCastle.AspNetCore.Demo

    3.注意事项

    (1).创建Autofac容器时不要忘了将ConfigureServices的返回值修改为IServiceProvider。
    (2).对应ASP.NET Core提及的不同的生命周期,Autofac也定义了对应的扩展方法,如InstancePerLifetimeScope等,默认为Transient模式,包括EntityFramwork等Context也是该种模式。
    (3).Autofac Core不支持从View中注入,但是可以和ASP.NET Core自带IOC容器配合使用。

    GitHub:https://github.com/maxzhang1985/YOYOFx  如果觉还可以请Star下, 欢迎一起交流。

    .NET Core 和 YOYOFx 的交流群: 214741894  

    如果你觉得本文对你有帮助,请点击“推荐”,谢谢.

  • 相关阅读:
    【bzoj4152】[AMPPZ2014]The Captain 堆优化Dijkstra
    【bzoj4547】Hdu5171 小奇的集合 矩阵乘法
    【bzoj1264】[AHOI2006]基因匹配Match 树状数组
    【bzoj3856】Monster 乱搞
    【bzoj4724】[POI2017]Podzielno 二分
    【bzoj4976】宝石镶嵌 乱搞+dp
    【bzoj4070】[Apio2015]雅加达的摩天楼 set+堆优化Dijkstra
    【bzoj4627】[BeiJing2016]回转寿司 离散化+树状数组
    【bzoj2124】等差子序列 STL-bitset
    【bzoj1996】[Hnoi2010]chorus 合唱队 区间dp
  • 原文地址:https://www.cnblogs.com/maxzhang1985/p/5919936.html
Copyright © 2011-2022 走看看