.NET5.0 依賴注入,關於 Autofac 使用


 

前置

工具 

VS2019

概念

關於以下幾個概念,自行百度。

控制反轉:IoC(Inversion of Control)

依賴注入:

容器:DI 容器(.NET Core 自帶),Autofac(本文要說明使用的)

 

一、安裝 Autofac

VS2019 打開 NuGet 管理器:工具 -> NuGet 包管理器 -> 管理解決方案的 NuGet 程序包

如圖,我安裝了這兩個

 

 

二、在項目中使用 Autofac

1、修改 Program.cs 文件

using 命名空間 Autofac.Extensions.DependencyInjection

這一步的操作,會替換 .NET Core 內置的 DI 容器。

public static void Main(string[] args)
{
    CreateHostBuilder(args).Build().Run();
}

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
    .UseServiceProviderFactory(new AutofacServiceProviderFactory())//添加Autofac服務
    .ConfigureWebHostDefaults(webBuilder =>
    {
        webBuilder.UseStartup<Startup>();
    });

2、修改 Startup.cs 文件

using 命名空間 Autofac

添加 ConfigureContainer() 方法

public class Startup
{
    //其他代碼
    public void ConfigureContainer(ContainerBuilder builder)
    {
        //……
    }
}

 

三、多種注入方式

1、構造函數注入

修改 Startup.cs 里面 ConfigureContainer() 方法

public class Startup
{
    //其他代碼
    public void ConfigureContainer(ContainerBuilder builder)
    {
         builder.RegisterType<UserService>().As<IUserService>();
    }
}

 控制器代碼,其中 rtnCommon 只是一個通用 Json 返回格式,無需關注。請關注注釋的幾句代碼。

public class AccountController : Controller
{
    private IUserService _userService; //定義
    public AccountController(IUserService userService)
    {
        _userService = userService; //完成注入
    }
    public async Task<IActionResult> Login(modUser user)
    {
        rtnCommon rtn = new rtnCommon();
        rtn = await _userService.Login(user); //調用
        return Json(rtn);
    }
}

對應的 Interface 和 class,定義接口和實現接口。

//接口
public interface IUserService
{
        Task<rtnCommon> Login(modUser user);
}
//實現
public class UserService : IUserService
{
    public async Task<rtnCommon> Login(modUser user)
    {
        rtnCommon rtn = new rtnCommon();
        rtn = new rtnCommon(enmReturnCode.Success);
        return rtn;
    }
}

2、屬性注入

修改 Startup.cs 里面 ConfigureContainer() 方法

public class Startup
{
    //其他代碼
    public void ConfigureContainer(ContainerBuilder builder)
    {
         builder.RegisterType<UserService>().As<IUserService>().PropertiesAutowired(); //屬性注入
    }
}

控制器中代碼

public class AccountController : Controller
{
    public IUserService _userService { set; get; } //屬性注入

    public async Task<IActionResult> Login(modUser user)
    {
        await _userService.Login(user); //調用
        //其他代碼
    }
}

3、方法注入

修改 Startup.cs 里面 ConfigureContainer() 方法

public class Startup
{
    //其他代碼
    public void ConfigureContainer(ContainerBuilder builder)
    {
         builder.RegisterType<UserRepository>()..As<IUserRepository>();
         builder.RegisterType<UserService>().OnActivated(e => e.Instance.SetService(e.Context.Resolve<IUserRepository>())).As<IUserService>(); //方法注入
    }
}

UserService.cs 代碼

public class UserService :IUserService
{
    private IUserRepository _userRepository;

    public void SetService(IUserRepository userRepository)
    {
        _userRepository = userRepository; //方法注入
    }
}

4、實現批量注入

需要 using 命名空間 System.Reflection

修改 Straup.cs 文件中的 ConfigureContainer() 方法

約定接口(Interface)和實現(class)都是以 Service 結尾的。

public void ConfigureContainer(ContainerBuilder builder)
{
    //加載程序集
    var urpIService = Assembly.Load("urp.IService");
    var urpService = Assembly.Load("urp.Service");
    //根據名稱約定(服務層的接口和實現均以Service結尾),實現服務接口和服務實現的依賴
    builder.RegisterAssemblyTypes(urpIService, urpService)
        .Where(t => t.Name.EndsWith("Service"))
        .AsImplementedInterfaces().PropertiesAutowired();
}  

 

四、生命周期

 

五、Autofac 配置文件

 

參考來源

https://www.cnblogs.com/Cjb8973/p/13858902.html (Cjb8973 的 一個非常簡單的入門級ASP.NET Core Autofac使用)

https://www.cnblogs.com/baocaige/p/11987902.html (Liu_Cabbage 的 FineAdmin.Mvc 使用ok-admin+ASP.NET MVC搭建的通用權限后台管理系統)【參考了是他的開源項目,不過項目是MVC5的】


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM