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下的跨程序集加载了





  • 相关阅读:
    siamese跟踪论文思考
    卷积与相关
    pytorch保存模型等相关参数,利用torch.save(),以及读取保存之后的文件
    发表在 Science 上的一种新聚类算法
    word2vec 中的数学原理详解
    一种并行随机梯度下降法
    一种利用 Cumulative Penalty 训练 L1 正则 Log-linear 模型的随机梯度下降法
    最大熵学习笔记(六)优缺点分析
    最大熵学习笔记(四)模型求解
    最大熵学习笔记(三)最大熵模型
  • 原文地址:https://www.cnblogs.com/boxrice/p/8301666.html
Copyright © 2011-2022 走看看