zoukankan      html  css  js  c++  java
  • .NetCore下使用Autofac做 IOC 容器

    在.NetCore中使用自带的IOC容器 写注入的时候会写很多,如果要自己封装的话也达不到预期的效果,所以这里采用Autofac来时替代 .NetCore自带的容器

    nuget首先引用Autofac.Extensions.DependencyInjection,关联的Autofac包也一起添加上了

    这里我对DI类的生命周期做了一些特性处理

    在.NetCore自带的容器中 有ScopedSingletonTransient,这里就不对这三个区别做介绍了

    我定义了三种特性,对应这三种方式

     public class ScopedDIAttribute : Attribute
        {
        }
    
    public class SingletonDIAttribute : Attribute
        {
        }
    
     public class TransientDIAttribute : Attribute
        {
        }

    那么在代码中怎么来使用Autofac注入这些对应特性的生命周期,代码如下

    在Startup中ConfigureServices中添加代码,并且修改返回值IServicesProvider ,这里我指定了需要扫描的应用程序集,并且为三种特性注入了对应的生命周期

    var builder = new ContainerBuilder();
                builder.Populate(services);
                var _assably = AppDomain.CurrentDomain.GetAssemblies();
                var _needImpl = _assably.Where(c => c.FullName.StartsWith("ExaminationServicesApplication") 
    || c.FullName.StartsWith("ExaminationServicesDomain")
    || c.FullName.StartsWith("ExaminationServicesInfrastructure")).ToArray(); builder.RegisterAssemblyTypes(_needImpl) .Where(t => t.GetCustomAttribute<ScopedDIAttribute>() != null) .AsImplementedInterfaces() .InstancePerLifetimeScope(); builder.RegisterAssemblyTypes(_needImpl) .Where(t => t.GetCustomAttribute<TransientDIAttribute>() != null) .AsImplementedInterfaces() .InstancePerDependency(); builder.RegisterAssemblyTypes(_needImpl) .Where(t => t.GetCustomAttribute<SingletonDIAttribute>() != null) .AsImplementedInterfaces() .SingleInstance(); builder.RegisterDynamicProxy(); this.ApplicationContainer = builder.Build(); return new AutofacServiceProvider(this.ApplicationContainer);

     builder.RegisterDynamicProxy(); 这个是对AspectCore 针对 Autofac 实现AOP的处理

    做完这些我们只需要在对应的实现类中加入对应的特性即可完成注入,不需要在startup里面大量的写 AddScoped了

    [ScopedDI]
        public class DemoRepository :BaseRepository<School>, IDemoRepository
        {
       }
  • 相关阅读:
    nyoj--325--zb的生日(简单dp)
    nyoj--124--中位数(水题)
    nyoj--90--整数划分(母函数)
    nyoj--18--The Triangle(dp水题)
    CodeForces ---596B--Wilbur and Array(贪心模拟)
    nyoj--1023--还是回文(动态规划)
    poj--3984--迷宫问题(bfs+路径记录)
    Netty(4)Stream by codec(粘包与拆包)
    Netty(1-1)Discard
    Netty:option和childOption参数设置说明
  • 原文地址:https://www.cnblogs.com/liyouming/p/9857421.html
Copyright © 2011-2022 走看看