首页 > 其他分享 >Autofac 注入仓储模式

Autofac 注入仓储模式

时间:2022-10-01 10:32:15浏览次数:49  
标签:Autofac XXX ConfigureContainer 仓储 containerBuilder public 注入

一、配置Autofac替换内置DI

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

在这里插入图片描述

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

在这里插入图片描述

  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());
    }
  1. AutofacRegisterModule.cs类 注入仓储层和服务层
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

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<UserService>().As<IUserService>().InstancePerDependency();; 单例注入:containerBuilder.RegisterType<UserService>().As<IUserService>().SingleInstance(); 生命周期注入: containerBuilder.RegisterType<UserService>().As<IUserService>().InstancePerLifetimeScope();

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

访问/User/Index,_userService成功注入,正确获取结果。 在这里插入图片描述

演示项目结构:

在这里插入图片描述

标签:Autofac,XXX,ConfigureContainer,仓储,containerBuilder,public,注入
From: https://blog.51cto.com/u_15706023/5728156

相关文章

  • 聊聊SQL注入
    SQL注入问题概述:首先SQL注入是一个非常危险的操作,很可能被一些不怀好意的人钻空导致我们系统出现异常等状况,比如数据库遭到破坏或被入侵。原因:使用JDBC的Statem......
  • 学习笔记-SQL注入(SQLI-LABS第一关)
    初学者掌握手工注入的过程:(1)判断是否存在注入点//(URL,POST表单,HTTP头部字段......)(2)判断字段长度(字段数)//(有可能保存在后台数据库某一个表当中......
  • Timer定时器在项目初始化的时候注入service为null
    问题在自定义的timer中需要注入业务类接口(service)完成相应的操作,但是在通过@Autowired注入后为null,导致在执行业务操作的时候报空指针错误。源代码需要做一个定时更新数......
  • ERROR--微服务无法注入Nacos中
    原因一:nacos没有正确启动nacos双击启动时默认是以集群的方式启动,所以会报错,在cmd下用命令启动startup.cmd-mstandalone原因二:没有导入web依赖<dependency><gro......
  • 常用mysql注入语句
    1、利用orderby判断字段数。2、利用unionselect联合查询,获取表名。0'unionselect1,group_concat(table_name),3frominformation_schema.tableswheretable_schema......
  • 2022-09-28 依赖注入
    目录spring依赖注入方式setter注入简单类型引用类型构造器注入引用类型(了解)简单类型(了解)问题,解决方法方式一方式二依赖注入方式选择依赖自动装配自动装配方式有哪些依......
  • 学习笔记-SQL注入1(注入点类型)
    SQL注入示例通过在用户名出传入参数'or1=1--进行万能密码登录selectusername,passwdfromuserwhereusername='text'andpassword='text'//正常语......
  • Spring-依赖注入
    1.依赖注入(DI)依赖注入是IOC(ioc获取资源的方式:之前要主动获取,现在是被动接受)的具体实现方式,在依赖的对象设置相对应的方法(比如set方法,有参构造),以当前设置好的方法来接......
  • 1.Spring、IOC与依赖注入
    Spring概述Spring是分层的JavaSE/EE应用full-stack轻量级开源框架,以IoC(InverseOfControl:反转控制)和AOP(AspectOrientedProgramming:面向切面编程)为内核,提供了展现层Spr......
  • SpringBoot中集成websocket后WebSocketServer中注入mapper为空
    场景SpringBoot整合WebSocket时调用service和mapper的方法:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/114829426上面讲了在集成websocket后,调用mapper......