Autofac 注入仓储模式

本文涉及的产品
实时计算 Flink 版,1000CU*H 3个月
实时数仓Hologres,5000CU*H 100GB 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
简介: 一、配置Autofac替换内置DI安装Nuget包:Autofac,Autofac.Extensions.DependencyInjectionProgram.cs中CreateHostBuilder方法后加上.UseServiceProviderFactory(new AutofacServiceProviderFactory()) ; 告诉程序要使用Autofac。Startup.cs...

一、配置Autofac替换内置DI

  1. 安装Nuget包:Autofac,Autofac.Extensions.DependencyInjection

image.png

  1. Program.cs中CreateHostBuilder方法后加上.UseServiceProviderFactory(new AutofacServiceProviderFactory()) ; 告诉程序要使用Autofac。

image.png

  1. Startup.cs中增加方法ConfigureContainer(ContainerBuilder containerBuilder),实例注入的地方,配置完成。同时防止startup.cs代码过多,建一个Module把注入代码搬走,新建AutofacRegisterModule.cs类把ConfigureContainer的代码移过去。而在ConfigureContainer中调用即可。

     // 然后在startup类中新建ConfigureContainer方法,配置
     public void ConfigureContainer(ContainerBuilder builder)
     {
         
         
         // 直接用Autofac注册我们自定义的 
         builder.RegisterModule(new AutofacRegisterModule());
     }
    
  2. AutofacRegisterModule.cs类 注入仓储层和服务层
    ```csharp
    public class AutofacRegisterModule : Autofac.Module
    {

     /// <inheritdoc/>
     //重写Autofac管道Load方法,在这里注册注入
     protected override void Load(ContainerBuilder builder)
     {
         var basePath = AppContext.BaseDirectory;
         //如需加载实现的程序集,将dll拷贝到bin目录下即可,不用引用dll
         var tmp = Path.Combine(basePath, "XXX.XXX.IService.dll");
         var IServices = Assembly.LoadFrom(tmp);
    
         var Services = Assembly.LoadFrom(Path.Combine(basePath, "XXX.XXX.Service.dll"));
    
         var IRepository = Assembly.LoadFrom(Path.Combine(basePath, "XXX.XXX.IRepository.dll"));
    
         var Repository = Assembly.LoadFrom(Path.Combine(basePath, "XXX.XXX.Repository.dll"));
    
        //根据名称约定(服务层的接口和实现均以Service结尾),实现服务接口和服务实现的依赖

        builder.RegisterAssemblyTypes(IServices, Services)

        .Where(t => t.Name.EndsWith("Service") || t.Name.EndsWith("Work"))

        .AsImplementedInterfaces();



        //根据名称约定(数据访问层的接口和实现均以Repository结尾),实现数据访问接口和数据访问实现的依赖

        builder.RegisterAssemblyTypes(IRepository, Repository)

        .Where(t => t.Name.EndsWith("Repository") || t.Name.EndsWith("Work"))

        .AsImplementedInterfaces();
        //获取所有控制器类型并使用属性注入
        Type[] controllersTypeAssembly = typeof(Startup).Assembly.GetExportedTypes()
            .Where(type => typeof(ControllerBase).IsAssignableFrom(type)).ToArray();
        builder.RegisterTypes(controllersTypeAssembly).PropertiesAutowired();
    }
}
# 二、构造函数注入
新建IUserService,类UserService,控制器UserController
```csharp
public interface IUserService
    {
        public string GetUserName();
    }
 public class UserService
    {
   
   
        public string GetUserName()
        {
   
   
            return "张三";
        }
    }
 public class UserController : Controller
    {
   
   
        private readonly IUserService _userService;
        public UserController(IUserService userService)
        {
   
   
            _userService = userService;
        }
        public IActionResult Index()
        {
   
   
            string name = _userService.GetUserName();
            return Content(name);
        }
    }

在上面的ConfigureContainer方法把UserService注入进来,默认是瞬时注入
瞬时注入:containerBuilder.RegisterType().As().InstancePerDependency();;
单例注入:containerBuilder.RegisterType().As().SingleInstance();
生命周期注入: containerBuilder.RegisterType().As().InstancePerLifetimeScope();

/// <summary>
        /// Autofac注册服务的地方,Autofac会自动调用
        /// </summary>
        /// <param name="containerBuilder"></param>
        public void ConfigureContainer(ContainerBuilder containerBuilder)
        {
   
   
            //注册服务
            containerBuilder.RegisterType<UserService>().As<IUserService>();
        }

访问/User/Index,_userService成功注入,正确获取结果。
image.png

演示项目结构:

image.png

目录
相关文章
|
资源调度 JavaScript 前端开发
vue-element-admin 综合开发四:axios安装和封装、mock安装/学习/使用
这篇文章是关于如何在Vue项目中使用axios进行网络请求、二次封装axios以及使用mockjs模拟响应数据的教程。
386 1
vue-element-admin 综合开发四:axios安装和封装、mock安装/学习/使用
|
网络安全
rsync报错: Operation not permitted (1)
[rsync报错:rsync: chgrp “.initial-setup-ks.cfg.jaXlVz” (in backup) failed: Operation not permitted (1)] 问题背景:在配置好rsync服务和客户端后,客户端从服务端拉取是正常的,但从客户端推送到服务端报错。 a,单独推送目录会报这个错误 rsync: recv_generator: mkdir “opt” (in backup) failed: Permission denied (13)
2206 0
|
jenkins 持续交付 开发工具
『Jenkins』Jenkins部署.Net Core——直接跳过坑带你部署
📣读完这篇文章里你能收获到 - 本文将以图文的形式带你一步一步部署 - 对于其中的坑会提前告知跳过,避免踩中
1039 0
『Jenkins』Jenkins部署.Net Core——直接跳过坑带你部署
|
6月前
|
Ubuntu 网络协议 应用服务中间件
在 Ubuntu 上安装 Nginx
在 Ubuntu 上安装和配置 Nginx 非常简单。首先更新系统包,然后通过 `apt` 安装 Nginx,检查服务状态并配置防火墙规则。访问服务器 IP 测试是否成功显示默认页面。还可管理服务、创建虚拟主机及排查常见问题,适合新手快速上手部署高性能 Web 服务。
785 0
|
C语言
npm 切换镜像站点
npm 切换镜像站点
804 9
|
自然语言处理 安全 算法
【Qt 基础 】深入理解Qt:qApp的全面掌握与实践
【Qt 基础 】深入理解Qt:qApp的全面掌握与实践
880 1
|
安全 Shell 网络安全
【Git】TortoiseGit(小乌龟)配置SSH和使用
【Git】TortoiseGit(小乌龟)配置SSH和使用
1503 0
|
存储 运维 监控
基于EF Core存储的Serilog持久化服务
【7月更文挑战第5天】EF Core 和 Serilog 整合实现日志持久化\n通过 EF Core ORM 将 Serilog 日志记录存储到数据库,提供灵活的日志管理。步骤包括:配置 EF Core 数据库上下文(定义 `LogEntry` 实体,设置数据库连接)、配置 Serilog(指定 EF Core 接收器,定义日志格式和过滤规则)、实现 EF Core 接收器(转换日志事件为实体并保存)。示例中,`LogEntry` 类包含日志信息,`LogDbContext` 用于数据库交互,Serilog 使用 `EfCoreSink` 将日志写入数据库,便于后期查询和分析。
249 5
|
NoSQL Java Redis
【Azure Redis Cache】对StackExchange.Redis IOCP错误消息的解读
【Azure Redis Cache】对StackExchange.Redis IOCP错误消息的解读
267 0