首页 > 编程语言 >C# 初使autofac IOC容器

C# 初使autofac IOC容器

时间:2023-02-15 15:22:44浏览次数:34  
标签:Autofac C# 初使 作用域 实例 using IOC builder

  先捋下概念。

  IOC 称Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想,这种思想最大的好处是解耦,依赖于接口而非依赖于实例,充分体现了面向接口编程,方便日后维护和迭代。

  DI 称Dependency Injection,即"依赖注入",他是一个技术,要想实现IOC设计思想,我们就需要借助DI这个技术,他能够根据引用无限制的注入(比如类A引用到类B,类B又引用类C),旧的New方式使用类A的话,我们需要分别New出类B和类C的实例。如果使用IOC这种设计的话,我们就可以借助DI自动进行无限注入,不需要关心他的引用。

  IOC容器有很多,我目前接触到了.Net Core内置的IServiceCollection和第三方autofac。了解更多可以去百度。这里不在列出。

  

 

 

 

  既然我们把创建对象的工作交给了IOC,IOC就可以在创建的时候搞些事情,比如对象的生命周期和AOP

  

1、瞬时 InstancePerDependency:每次获取的服务实例都不一样;

2、单例 SingleInstance:在整个容器中获取的服务实例都是同一个;

3、作用域 InstancePerLifetimeScope:相同作用域下获取到的服务实例相同;

4、作用域 InstancePerMatchingLifetimeScope(“作用域名称”):可以指定到某一个具体作用域;

5、每次请求 InstancePerRequest:不同的请求获取的服务实例不一样;

6、隐式关系类型的嵌套作用域 InstancePerOwned:可以使用每一个拥有实例的注册来依赖关系限定到拥有的实例。

  下面简单说下autofac的使用。网上有很多单个类使用的方式,这里不再写了,实际项目也不会单个类一个一个注入。更多的是通过封装自动注入所有类。

  使用第三方IOC容器Autofac,首先需要引用Autofac,Autofac.Extensions.DependencyInjection两个包。

  项目结构

 

  我把IOC注入的工作写到了Util类中。

  1.首先定义几个常用的生命周期接口(目的是自动注册的时候知道这个类需要的生命周期)

 

 

定义接口的时候继承于上面定义的生命周期

 

 

 

 

    2.定义程序集类(获取所有程序集进行注册IOC)

 

 

 

  3.编写autofac扩展类(通过查询程序集的类进行注入)

 

using Autofac;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.Loader;

namespace MrZhu.Util
{
/// <summary>
/// Autofac拓展类
/// </summary>
public class ApiModule:Autofac.Module
{
//private static readonly ProxyGenerator _generator = new ProxyGenerator();
protected override void Load(ContainerBuilder builder)
{
// 获取所有创建的项目Lib
var libs = GlobalAssemblies.AllAssemblies;

// 将lib转成Assembly
List<Assembly> assemblies = new();
foreach (var lib in libs)
{
assemblies.Add(lib);
}

// 反射获取其中所有的被接口修饰的类型,并区分生命周期
builder.RegisterAssemblyTypes(assemblies.ToArray())
.Where(t => t.IsAssignableTo<IocTagScope>() && !t.IsAbstract)
.AsSelf()
.AsImplementedInterfaces()
.InstancePerLifetimeScope()
.PropertiesAutowired();

builder.RegisterAssemblyTypes(assemblies.ToArray())
.Where(t => t.IsAssignableTo<IocTagSington>() && !t.IsAbstract)
.AsSelf()
.AsImplementedInterfaces()
.SingleInstance()
.PropertiesAutowired();

builder.RegisterAssemblyTypes(assemblies.ToArray())
.Where(t => t.IsAssignableTo<IocTagTransient>() && !t.IsAbstract)
.AsSelf()
.AsImplementedInterfaces()
.PropertiesAutowired();

builder.RegisterAssemblyTypes(assemblies.ToArray())
.Where(t => t.IsAssignableTo<ControllerBase>() && !t.IsAbstract)
.AsSelf()
.PropertiesAutowired();
}
}
}

   4.最后一步Web项目中Program.cs注册IOC

 

 

//注册Autofac
//将控制器类注册到容器中
builder.Services.AddControllers().AddControllersAsServices();

builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
builder.Host.ConfigureContainer<ContainerBuilder>(builder =>
{
// builder.AutofacExtensions();
builder.RegisterModule<ApiModule>();
});

调试查看效果(通过注入已经可以根据接口自动调用BLL的方法,实现面向接口编程)

 

标签:Autofac,C#,初使,作用域,实例,using,IOC,builder
From: https://www.cnblogs.com/zhumengmeng/p/17123175.html

相关文章

  • 【LeetCode队列#04】逆波兰表达式求值(仍然是经典的栈操作)
    逆波兰表达式求值力扣题目链接(opensnewwindow)根据逆波兰表示法,求表达式的值。有效的运算符包括+,-,*,/。每个运算对象可以是整数,也可以是另一个逆波兰表达......
  • Oracle ASM磁盘组的常用操作
    1.查看现有磁盘组信息selectgroup_numbergno,name,state,type,total_mb,free_mb,required_mirror_free_mbrmfmb,usable_file_mbufmbfromv$asm_diskgroup;   ......
  • How to solve “Warning: your configuration is out of sync. Please run make menu
    makedefconfigcleanhttps://forum.openwrt.org/t/how-to-solve-warning-your-configuration-is-out-of-sync-please-run-make-menuconfig-oldconfig-or-defconfig/10843......
  • Vue 自定义指令-directive
    什么是自定义指令vue官方提供了v-text、v-for、v-model、v-if等常用的指令。除此之外vue还允许开发者自定义指令。局部自定义指令的使用<body><divid="app">......
  • CGLIB动态代理
    CGLIB动态代理是基于类继承的代理,不能被继承的方法也不能被代理,比如final,private修饰的方法.CGLIB中重要的两个概念:MethodInterceptor是方法拦截器,代理类只需......
  • postgre 的ST_Intersection 求面的交集
    一开始是给了一坨面的数据 需要将面按照街镇进行分割 我想的是改库表 对geometry数据进行处理   后面发现了st_intersection这个函数 求两个面的交集 ......
  • Vue 自定义指令-directives
    什么是自定义指令vue官方提供了v-text、v-for、v-model、v-if等常用的指令。除此之外vue还允许开发者自定义指令。局部自定义指令的使用<body><divid="app">......
  • leetcode-数据结构与算法
    第0001题:求两数之和leetcode对应题号:1力扣-原题链接:[请点击此处](https://leetcode.cn/problems/two-sum/"请点击此处")方法一思路暴力破解法,时间复杂度是\(O(n......
  • 报错:tar: This does not look like a tar archive
    一、现象解压时报错: 二、解决办法gzip-dxxxx.tar.gz(对于.tar.gz文件的处理方式)tar-xfxxxx.tar(对于.tar文件处理方式) 三、查看 ......
  • windows服务器 查看IIS哪个应用程序池占用CPU过高
    1.进入cmd2. %systemroot%\system32\inetsrv\AppCmd.exelistwp    这样就能找到活动的应用程序池的PID了3.对照资源管理器的PID就可以知道是哪个站点出现问......