zoukankan      html  css  js  c++  java
  • 在ASP.Net Core下,Autofac实现自动注入

    之前使用以来注入的时候,都是在xml配置对应的接口和实现类,经常会出现忘了写配置,导致注入不生效,会报错,而且项目中使用的是SPA的模式,ajax报错也不容易看出问题,经常会去排查日志找问题。

    于是在园子里面看到园友的自动注入,觉得很有意思,但是园友是用的MVC5,就自己再.Net Core上试了一下,于是就记录下来使用的过程

    在asp.net core中,自带了一个依赖注入容器,但是功能有限,我们一般会采用第三方的容器来接管自带的容器,

    var builder = new ContainerBuilder();
    builder.Populate(services);
    var baseType = typeof(AutoInject);
    var assembly = Assembly.GetEntryAssembly();
                
    builder.RegisterAssemblyTypes(assembly)
                    .Where(t => baseType.IsAssignableFrom(t) && t != baseType)
                    .AsImplementedInterfaces().InstancePerLifetimeScope();
    
    this.ApplicationContainer = builder.Build();
    AutoInject 是一个空的接口,只会为了标记一下哪些地方需要被autofac自动注入

    然后来试一下,添加一个接口Itest.cs,实现AutoInject
     public  interface ITest: AutoInject
        {
           string GetName();
       }

    添加一个实现类Test.cs

      public class Test:ITest
        {
            public string GetName()
            {
                return "getName";
            }
        }

    在控制器的构造方法里面把需要注入的接口添加进去

    private readonly ITest test;
    
            public HomeController(ITest test)
            {
                this.test = test;
            }

    运行

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

    autofac的RegisterAssemblyTypes方法参数是一个数组,把需要注入的程序集加载起来,拼成一个数组,传递进去就可以实现在.Net Core下的跨程序集加载了





  • 相关阅读:
    嵌入式Linux的启动过程
    【转载】vim 中文帮助手册的安装
    面向对象之编写驱动程序--中断(linux系统、s3c6410开发板)
    【转】DBCC IND / DBCC PAGE
    【转】索引查询 sys.dm_db_index_physical_stats
    【tag】Enum.HasFlag 方法
    【tag】Tuple 类 使用介绍
    【fixed point】柯里化(currying) C#实现
    SqlDataAdapter 批量更新 DataTable
    sqlCacheDependency 使用
  • 原文地址:https://www.cnblogs.com/boxrice/p/8301666.html
Copyright © 2011-2022 走看看