zoukankan      html  css  js  c++  java
  • Asp.Net Core 依赖注入默认DI,Autofac注入

    使用默认DI

    修改Startup类方法ConfigureServices如下:

    public void ConfigureServices(IServiceCollection services)
    {
       services.AddMvc();
       //注册接口
       services.AddTransient<IDbMovieService, DbMovieService>();
    }

    controller构造函数调用如下:

    public readonly IDbMovieService _DbMovieService;
    public HomeController(IDbMovieService dbMovieService)
    {
        _DbMovieService = dbMovieService;
    }
    public IActionResult Index()
    {
        _DbMovieService.MovieAnalysis();
        return View();
    }

    瞬时
    瞬时(Transient)生命周期服务在它们每次请求时被创建。这一生命周期适合轻量级的,无状态的服务。

    作用域
    作用域(Scoped)生命周期服务在每次请求被创建一次。

    单例
    单例(Singleton)生命周期服务在它们第一次被请求时创建(或者如果你在 ConfigureServices
    运行时指定一个实例)并且每个后续请求将使用相同的实例。如果你的应用程序需要单例行为,建议让服务容器管理服务的生命周期而不是在自己的类中实现单例模式和管理对象的生命周期。

     使用Autofac

     首先,需要从nuget引用相关的包.

    Autofac

    Autofac.Extensions.DependencyInjection(这个包扩展了一些微软提供服务的类.来方便替换autofac)

    然后,我们修改Startup中的ConfigureServices代码如下:

    public IServiceProvider ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
     // Add Autofac
        var containerBuilder = new ContainerBuilder();
        containerBuilder.RegisterModule<AutofacConfig>();
        containerBuilder.Populate(services);
        var container = containerBuilder.Build();
        return new AutofacServiceProvider(container);
    }

    AutofacConfig.cs源码如下:

    using Autofac;
    using MG.AngleSharp;
    using MG.AngleSharp.Service;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    
    namespace MG.Web.AutofacConfig
    {
        public class AutofacConfig: Module
        {
            protected override void Load(ContainerBuilder builder)
            {
                builder.RegisterType<DbMovieService>().As<IDbMovieService>();
            }
        }
    }

    加载程序集注册方式如下:

    public IServiceProvider ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
        // Add Autofac
        var builder = new ContainerBuilder();
        builder.Populate(services);
        //加载程序集
        // var assembly = this.GetType().GetTypeInfo().Assembly;
        var assembly = Assembly.Load("MG.AngleSharp");//获取MG.AngleSharp 程序集
        var baseType = typeof(IDependency);//IDependency 是一个接口  
        builder.RegisterAssemblyTypes(assembly)
               .Where(m => baseType.IsAssignableFrom(m) && m != baseType)
               .AsImplementedInterfaces().InstancePerLifetimeScope();
        var container = builder.Build();
        return new AutofacServiceProvider(container);
     }

    IDependency是一个空接口类,用于判断是否需要注册该接口。

    调用方式推荐使用构造函数方式引用。 

    获取bin目录下所有程序集

    //加载程序集
    //var assembly1 = this.GetType().GetTypeInfo().Assembly;//获取当前程序集
    var assemblys = AppDomain.CurrentDomain.BaseDirectory;
    DirectoryInfo theFolder = new DirectoryInfo(assemblys);
    foreach (var item in theFolder.GetFiles("*.dll"))
    {
       var assembly = Assembly.Load(item.Name.Replace(".dll", ""));//加载程序集
       var baseType = typeof(IDependency);//IDependency 是一个接口  
       builder.RegisterAssemblyTypes(assembly)
              .Where(m => baseType.IsAssignableFrom(m) && m != baseType)
              .AsImplementedInterfaces().InstancePerLifetimeScope();
    }
  • 相关阅读:
    链表补充及链表和数组的区别
    单链表(不带头结点)
    动态数组
    【笔记】SQL语言的设计与编写
    netty 学习笔记一:感受 IO编程 NIO编程 与 Netty 编程
    分享系列——Thread#join() 在 Java 源码中并没有 notify ,被阻塞线程是如何唤醒的?答案在 JVM
    RabbitMQ 安装 图笔记版
    RabbitMQ 安装——RPM 和 TAR 两种方式
    学原理脱坑 之 centos 6/7 更新 UTC 以及 设置系统时区
    数据结构和算法篇——散列表
  • 原文地址:https://www.cnblogs.com/miskis/p/8549755.html
Copyright © 2011-2022 走看看