• .net core3.1 实现autofac注入


    autofac 是实现控制反转(IOC)的一种方式,如果不清楚IOC是什么,可以看看这个园友的文章(浅谈IOC---博客园----DebugLZQ,个人觉得写得挺简单易懂的

     

    下面这些主要是一些运用

    1. 添加引用nuget引用:

    Autofac

    Autofac.Extensions.DependencyInjection

    2. 修改Program.cs

    修改默认的服务提供工厂为AutofacServiceProviderFactory,

    .UseServiceProviderFactory(new AutofacServiceProviderFactory())

    3. 修改startup.cs

    添加ConfigureContainer方法,此时就是添加注入服务方式,最常用的就是分单个服务注入或者多个服务注入

    public void ConfigureContainer(ContainerBuilder builder)
    {
    
    } 

    3.1 单个服务注入

      按接口注入:

    builder.RegisterType<IEatService>().AsImplementedInterfaces();
    //builder.RegisterType<EatService>().As<IEatService>();

      按实例注入

    EatService eat = new EatService();
    builder.RegisterInstance(eat).As<IEatService>();

    3.2 批量服务注入

      按照加载指定的程序集名称的方式注入;这个示例注入了该程序集中所有的Service结尾的业务逻辑实现层,所以想要注入的服务必须以Service结尾。

    Assembly servive = Assembly.Load("PApplication");
    Assembly repository = Assembly.Load("PServer");
    builder.RegisterAssemblyTypes(servive, repository)
           .Where(t => t.Name.EndsWith("Service"))
           .AsImplementedInterfaces();

      先加载所有应用程序域所有程序集再筛选指定的程序集;这个示例注入了添加了三个自定义属性的所有服务,对应.net core 注入服务的三种方式:AddSingleton,AddTransient,AddScoped, 对服务命名没有要求

    //var _assably = AppDomain.CurrentDomain.GetAssemblies();
    //var _needImpl = _assably.Where(c => c.FullName.StartsWith("PServer") || c.FullName.StartsWith("PApplication")).ToArray();
    
    var _needImpl1= DependencyContext.Default.RuntimeLibraries.Where(o => o.Name.StartsWith("PServer")|| o.Name.StartsWith("PApplication")).Select(o => Assembly.Load(new AssemblyName(o.Name))).ToArray();
    
    builder.RegisterAssemblyTypes(_needImpl1)
                             .Where(t => t.GetCustomAttribute<ScopedAttribute>() != null)
                             .AsImplementedInterfaces()
                            .InstancePerLifetimeScope();
    builder.RegisterAssemblyTypes(_needImpl1)
                           .Where(t => t.GetCustomAttribute<TransientAttribute>() != null)
                           .AsImplementedInterfaces()
                          .InstancePerDependency();
    
    builder.RegisterAssemblyTypes(_needImpl1)
                            .Where(t => t.GetCustomAttribute<SingletonAttribute>() != null)
                            .AsImplementedInterfaces()
                           .SingleInstance();

    上面获取所有应用程序集有两种方式,可以通过AppDomain的方式,AppDomain为应用程序域,GetAssemblies()只会获取到已加载到当前域的程序集,有时候获取不到引用的程序集(不知道为什么,bin文件里面也有相关的dll),所以这里换了一种方式用的DependencyContext的方式,引用了 Microsoft.Extensions.DependencyModel,DependencyContext.Default获取到当前应用依赖的所有对象(dll)

  • 相关阅读:
    剑指offer之 二维数组的查找
    常用的基础算法总结之 希尔排序
    让shell脚本中的echo输出带颜色
    nginx利用lua实现nginx反向代理proxy_store缓存文件自删除
    LNMP平滑升级nginx并安装ngx_lua模块教程
    nginx的luajit安装luarocks并安装luafilesystem
    PHP图片识别成文字
    使用tesseract-ocr破解网站验证码
    利用开源程序(ImageMagick+tesseract-ocr)实现图像验证码识别
    http://ocr.wdku.net/
  • 原文地址:https://www.cnblogs.com/roubaozidd/p/14518222.html
Copyright © 2020-2023  润新知