隐藏

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

发布:2022/1/18 10:00:21作者:管理员 来源:本站 浏览次数:942

修改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();

}