zoukankan      html  css  js  c++  java
  • .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的】

  • 相关阅读:
    python的特殊数字类型(无穷大、无穷小等)
    Python100天打卡-Day10-图形用户界面和游戏开发
    Pygame
    VINS-Fusion代码阅读(四)
    Unity Shader-热空气扭曲效果
    Java 游戏报错 看不懂求教
    Unity3D——Epirome框架_TimerManager计时任务管理器
    Qt 为QPushButton、QLabel添加鼠标移入移出事件
    curl测试dns解析时间及tcp连接时间
    notepad++的NppFTP插件远程连接linux操作系统
  • 原文地址:https://www.cnblogs.com/clis/p/14294042.html
Copyright © 2011-2022 走看看