Asp.Net Core 依赖注入默认DI,Autofac注入

使用默认DI

修改Startup类方法ConfigureServices以下:ide

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)生命周期服务在它们每次请求时被建立。这一辈子命周期适合轻量级的,无状态的服务。ui

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

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

 使用Autofac

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

Autofac对象

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

而后,咱们修改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();
}
相关文章
相关标签/搜索