码迷,mamicode.com
首页 > Web开发 > 详细

.NET5 依赖注入,关于 Autofac 使用

时间:2021-01-19 12:27:05      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:http   std   www   mon   net   figure   asi   where   加载   

 

前置

工具 

VS2019

概念

关于以下几个概念,自行百度。

控制反转:IOC(Inversion of Control)

依赖注入:

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

 

一、安装 Autofac

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

如图,我安装了这两个

技术图片

 

 

二、在项目中使用 Autofac

1、修改 Program.cs 文件

using 命名空间 Autofac.Extensions.DependencyInjection

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 void ConfigureContainer(ContainerBuilder builder)
{
    builder.RegisterType<UserService>().As<IUserService>();
}

3、控制器构造函数注入

 控制器代码,其中 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;
    }
}

4、实现批量注入

前面第1和第3步不变,修改第2步。需要 using 命名空间 System.Reflection (C# 反射相关请自行百度。)

修改 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的】

.NET5 依赖注入,关于 Autofac 使用

标签:http   std   www   mon   net   figure   asi   where   加载   

原文地址:https://www.cnblogs.com/clis/p/14294042.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!