• Autofac 注入仓储模式


    一、配置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
    • 2
    • 3
    • 4
    • 5
    • 6
    1. AutofacRegisterModule.cs类 注入仓储层和服务层
    public class AutofacRegisterModule : Autofac.Module
        {
            /// 
            //重写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();
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    二、构造函数注入

    新建IUserService,类UserService,控制器UserController

    public interface IUserService
        {
            public string GetUserName();
        }
    
    • 1
    • 2
    • 3
    • 4
     public class UserService
        {
            public string GetUserName()
            {
                return "张三";
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
     public class UserController : Controller
        {
            private readonly IUserService _userService;
            public UserController(IUserService userService)
            {
                _userService = userService;
            }
            public IActionResult Index()
            {
                string name = _userService.GetUserName();
                return Content(name);
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

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

    /// 
            /// Autofac注册服务的地方,Autofac会自动调用
            /// 
            /// 
            public void ConfigureContainer(ContainerBuilder containerBuilder)
            {
                //注册服务
                containerBuilder.RegisterType<UserService>().As<IUserService>();
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

    演示项目结构:

    在这里插入图片描述

  • 相关阅读:
    使用verilog语言实现简单的卷积神经网络
    mysql的redo和undo-log
    JNI编程之java层和native层的数组数据的交互
    JS中BOM编程:设置浏览器地址栏地址
    力扣刷题-数组-螺旋矩阵
    使用 puppeteer 加载 html 文件来运行 js 文件
    SpringMvc向request域中设置数据
    MM32F0020 UART1中断接收和UART1中断发送
    JavaScript 数组 【‘遍历数组’,‘增‘,‘删’,‘改‘,‘查‘】 详解 +增删查改数组案例
    怎么把录音转文字?快把这些方法收好
  • 原文地址:https://blog.csdn.net/weixin_46178278/article/details/127131711