• AutoFac自动注入的实现过程


    IDependency 依赖注入接口,表示该接口的实现类将自动注册到IoC容器中

    //autofac
    builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
    builder.Host.ConfigureContainer<ContainerBuilder>(builder =>
    {
        #region 手动注入
    
        ////手动注入
        //builder.RegisterType<AService>().As<IAService>().InstancePerLifetimeScope();
        //builder.RegisterType<BService>().As<IBService>().InstancePerLifetimeScope();
    
        #endregion
    
        #region 自动注入
    
        //4、自动注册接口
        //* 筛选出对应条件的接口
        //* IsAssignableFrom:返回true的条件:是否直接或间接实现了IDependency
        //* IsAbstract:是否为抽象类
        //* AsImplementedInterfaces:以接口的形式注册
        //* InstancePerLifetimeScope:同一个Lifetime生成的对象是同一个实例
    
        //Assembly assembly = Assembly.Load(Assembly.GetExecutingAssembly().GetName().Name);
        //var dataAccess = Assembly.GetExecutingAssembly();
        //var assemblies = AppDomain.CurrentDomain.GetAssemblies().ToList();//这种写法AppDomain重新启动后会丢失程序集
    
        ////第一种
        /* 获取接口类型
        *通过IDependency标记需要依赖注入的接口
        *注册所有实现了IDependency接口的类型
        */
        //Type type = typeof(IDependency);
        //var dataAccess = Assembly.GetExecutingAssembly();
    
        //builder.RegisterAssemblyTypes(Assembly.Load("Dn.Core.Services"))
        //       .Where(t => t.Name.EndsWith("Service"))//.As<IDependency>()
        //       .AsImplementedInterfaces().InstancePerDependency();
    
        ////第二种
        //Type baseType = typeof(IDependency);
        ////var assemblies = AppDomain.CurrentDomain.GetAssemblies().ToList();//这种写法AppDomain重新启动后会丢失程序集
        //var assembly = Assembly.Load("Dn.Core.Services");//Assembly.GetEntryAssembly();
        //builder.RegisterAssemblyTypes(assembly)
        //                .Where(t => baseType.IsAssignableFrom(t) && t != baseType)
        //                .AsImplementedInterfaces().InstancePerLifetimeScope();
    
        #endregion
    });
    net6

     

    但是实际上,很多项目都会把项目分到其他的类库里面,如果使用Assembly.GetEntryAssembly();,放到其他的项目里面的可以被注入的类就无法被注入了,所以需要手动去加载其他的程序集,当然也可以用代码去扫描一下,

    AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName("程序集名称"));
    autofac的RegisterAssemblyTypes方法参数是一个数组,把需要注入的程序集加载起来,拼成一个数组,传递进去就可以实现在.Net Core下的跨程序集加载了

    https://www.cnblogs.com/boxrice/p/8301666.html

    https://blog.csdn.net/weixin_39926042/article/details/112812936?spm=1001.2101.3001.6650.10&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ELandingCtr%7EHighlightScore-10.queryctrv2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ELandingCtr%7EHighlightScore-10.queryctrv2&utm_relevant_index=11

  • 相关阅读:
    Consul运行
    springcloud+Zookeeper测试
    解决:sql2005 安装完后 没有服务的问题
    asp.net dataTable添加列
    C#关闭word进程
    无法将类型为“Microsoft.Office.Interop.Word.ApplicationClass”的 COM 对象强制转换为接口类型“Microsoft.Office.Interop.Word._Application”
    C#网页采集
    C#计算时间差值
    C#播放声音
    C#打开得到路径
  • 原文地址:https://www.cnblogs.com/love201314/p/15867152.html
Copyright © 2020-2023  润新知