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();
}
相關文章
相關標籤/搜索