zoukankan      html  css  js  c++  java
  • NET Core 整合Autofac和Castle

    NET Core 整合Autofac和Castle

    前言:

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

    1.ASP.NET Core中的Autofac

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

    1. "Microsoft.Extensions.DependencyInjection": "1.0.0",
    2. "Autofac": "4.1.1",
    3. "Autofac.Extensions.DependencyInjection": "4.0.0",

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

    1.1 ConfigureServices函数

    1. public IServiceProvider ConfigureServices(IServiceCollection services)
    2. {
    3. services.AddApplicationInsightsTelemetry(Configuration);
    4. services.AddMvc();
    5. return RegisterAutofac(services);
    6. }

    1.2 RegisterAutofac函数

    1. private IServiceProvider RegisterAutofac(IServiceCollection services)
    2. {
    3. var builder = new ContainerBuilder();
    4. builder.Populate(services);
    5. var assembly = this.GetType().GetTypeInfo().Assembly;
    6. builder.RegisterType<AopInterceptor>();
    7. builder.RegisterAssemblyTypes(assembly)
    8. .Where(type =>
    9. typeof(IDependency).IsAssignableFrom(type) && !type.GetTypeInfo().IsAbstract)
    10. .AsImplementedInterfaces()
    11. .InstancePerLifetimeScope().EnableInterfaceInterceptors().InterceptedBy(typeof(AopInterceptor));
    12. this.ApplicationContainer = builder.Build();
    13. return new AutofacServiceProvider(this.ApplicationContainer);
    14. }

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

    2.整合Castle的DynamicProxy

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

    1. .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  

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



    1. 如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
     
    分类: .NET Core
  • 相关阅读:
    【NOI2005T4】聪聪和可可-期望DP+记忆化搜索
    总结:最大权闭合子图
    【NOI2009T4】植物大战僵尸-最大权闭合子图+拓补排序
    codevs 1090 加分二叉树
    codevs 1503 愚蠢的宠物
    codevs 1992 聚会
    welcome to new life
    codevs 1066 引水入城
    codevs 2021 中庸之道
    POJ 2104 K-th Number
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/5936941.html
Copyright © 2011-2022 走看看